1. Pascal / Говнокод #12304

    +82

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    var
      u: longint;
     
    begin
      u := $-80000000;
      writeln(u);
    end.

    Жуквери в Дельфи7. Компилируется.

    Запостил: TarasB, 18 Декабря 2012

    Комментарии (77) RSS

    • Какое отношение этот код имеет к этому сайту?
      Ответить
      • Непосредственное.
        Ответить
        • Ай-яй. Попал плюс вместо минуса
          ---
          Это я к тому, что это что угодно, но не говнокод.
          Ответить
          • [cap]Дельфипроблемы[/cap]
            Ответить
          • Ньюфаг? Ты критерии значимости (тм) для говнокода почитай в правилах, что ли.
            Ответить
    • Говно не в коде...
      Ответить
      • А в авторе.
        Ответить
        • Ты прав. Сколько бы поциент не срал, все равно кишки до конца прочистить не может.
          Ответить
    • Вы просто завидуете. У вас это даже не компилируется.
      http://ideone.com/OnUqQz
      Ответить
      • Я знаю, я проверял^^
        А вот в Дельфи-7 компилируется, но даёт не то.
        Вопрос только, как задать нужную мне константу в 16ичном виде?
        Ответить
        • Очевидно же...

          Ой, нет, не очевидно. Кстати, в си тоже такой баг - пишем -0x80000000, а он выдает просто 0x80000000:
          http://ideone.com/i0lVWG
          Ответить
          • Это фича std::hex - после него число выводится как беззнаковое.
            Ответить
        • А какая константа тебе нужна?

          -2147483648 это 0x80000000, 2147483647 это 0x7FFFFFFF. Числа, лежащие за пределами этого диапазона (например +2147483648) в 32х битном знаковом инте тупо не представимы.

          P.S. Конечно же тебе хочется 2147483648, но оно, к сожалению не вошло в диапазон из-за злоебучего нуля, из-за которого положительных чисел влезло на 1 меньше, чем отрицательных.
          Ответить
          • > -2147483648 это 0x80000000
            первое входит в диапазон int, второе не входит
            Ответить
            • Всё просто:
              u := - $7FFFFFFF - 1;
              Или даже так:
              u := $80000001 - 1;
              Ответить
              • Первое - я так и сделал, но это некрасиво блин.
                Второе с переполнением, не то.
                То есть нормального способа задать эту константу в Дельфи нету.
                Ответить
                • Чем тебя переполнение не устроило?
                  Ответить
                • ДЕЛЬФИПРОБЛЕМЫ
                  Ответить
                • -1*$80000000 ?
                  Ответить
                  • Не в этом дело, а в том, что Дельфи не принимает константу $80000000 (sic!), хотя $80000001 и даже ($80000001 - 1) интерпретирует именно так, как ожидается.
                    Ответить
          • интересно, а где-нибудь в сишных стандартах вообще упоминается, что строго надо дополнительные коды использовать?
            Ответить
            • Да в сишном стандарте даже бит это объект, в котором как минимум должны быть значения 0 и 1. Походу троичный комп тоже вполне подходит...
              Ответить
              • троичному нет пути
                The representations of integral types shall define values by use of a pure binary numeration system.
                [Example: this International Standard permits 2’s complement, 1’s complement and signed magnitude representations for integral types. ]
                Ответить
            • Вот так С89 рассказывает о знаковом инте:
              If the sign bit is one, the value shall be modified in one of the following ways:
              — the corresponding value with sign bit 0 is negated (sign and magnitude);
              — the sign bit has the value −(2 N ) (two’s complement);
              — the sign bit has the value −(2 N − 1) (ones’ complement).
              Which of these applies is implementation-defined.


              А еще там допустимы padding биты, и есть требование, чтобы представления signed'ов и unsigned'ов для положительных чисел, которые можно записать signed'ом совпадали.

              P.S. Кстати в sign-and-magnitude будет джва нуля, зато Тарас будет доволен - такие инты абсолютно симметричны.
              Ответить
              • да, выбор из трёх - прямой, обратный и дополнительный, тащемта в С++ тоже только они упоминаются
                нам еще на 1 семестре рассказывали про модифицированные обратные и дополнительные - когда под знак выделяются джва разряда, что позволяет отлавливать underflow и overflow
                Ответить
                • Переполнения дельфин ловит и так, без двух разрядов под знак, за счёт флагов.
                  А вот хренли верблюду понадобился лишний бит - придумать не могу.
                  Ответить
                  • тут уже было чо про то, что дельфи нигде кроме x86 работать не может?
                    верблюд - это перл чтоли?
                    Ответить
                    • камл
                      а чё, на армах нет флага переполнения?
                      Ответить
                      • флаг переполнения наверняка есть в 99.999% процессоров
                        потому что его проще и дешевле выполнить в АЛУ, чем вводить ограничения по его неиспользованию
                        тем не менее, в стандарте С/С++ никто не требует его наличия
                        равно как и никто в стандарте не предоставляет способа получения его состояния

                        только ассемблер, только хардкор
                        либо специфические ловушки, что не факт что вообще практично
                        Ответить
                        • Ну так и нехер закладываться на его отсутствие.
                          Ответить
                          • ты невнимательно прочитал посыл
                            нехер закладываться на ассемблер x86

                            когда уже версию дельфей для андроида сделают?
                            Ответить
                            • Чёт я тогда ваще не понял, какая тогда вобще связь между дельфиньим способом ловить переполнения через флаги и привязкой к x86? Крестоспизднуть не по теме об 100 раз пережёванных недостатках Дельфи, не имеющих отношения к обсуждаемой проблеме?
                              Ответить
                      • Слышал, что Caml требует этот бит для с борьщика мусора. Как он его использует и зачем - ума не приложу.
                        Ответить
                        • http://stackoverflow.com/questions/3773985/why-is-an-int-in-ocaml-only-31-bits
                          Ответить
                          • Об 31битность зашкварились также Lisp и Smalltalk
                            Ответить
                            • А также Ruby.

                              Почитал по ссылке. Понял по значению, что не для гарбедж коллектора это используется
                              Ответить
        • Насколько существенно указание версии? В Дельфи-3 то же самое.
          Кстати, -$-80000000 почему-то выдаёт такой же результат, а -$80000000 не компилируется.
          Ответить
        • > как задать нужную мне константу
          Создать именованные константы - MIN_BYTE, MIN_WORD, MIN_INT, MIN_LONGINT. И юзать их.
          Ответить
        • А что-то типа high(longint) тут не прокатит?

          https://ideone.com/4cDkMA
          Ответить
          • low(longint) возвращает именно константу Тараса. Но извращенцы так не пишут это слишком тривиально.

            Да и потом это не слишком очевидно. Вдруг кому-нибудь нужно именно 2 в 31-й степени вне зависимости от размера типа longint в данной версии компилятора?
            Ответить
            • > low(longint) возвращает именно константу Тараса

              Ой, точно.
              Ответить
              • Константа Тараса звучит как какая-нибудь Постоянная Больцмана.
                Ответить
                • Постоянная Б. Тараса.
                  Ответить
                • Так и назовём.
                  Ответить
                  • http://ideone.com/z1Ejw0
                    Ответить
                    • http://ideone.com/qDsQd7

                      Q: Что такое постоянная Б. Тараса?
                      A: Это число не равное нулю, которое не меняется при смене знака.
                      Ответить
                      • Самое интересное, что эта константа зависит от доступной точности для этого числа и её может не существовать (даже для целых и даже знаковых чисел, как и на некоторых плаиформах).
                        Ответить
    • Плюсую, годно. Неужели никто не заметил, по какому основанию интерпретируется число после минуса?
      Ответить
    • показать все, что скрытоТише Тарасиха, не плач.
      Я куплю тебе калач.
      Ответить
    • TarasGovnoB
      Ответить
      • Скорее DelphiGovno-style.
        Интересно почему не @торасег.
        С одной стороны бажность багланда меня не удивляет, но всё-равно плюсану.
        Ответить
    • Поскольку все делают вид, что не заметили или всем похуй, открою спойлер. В Дельфи действительно есть жуквери, потому что такой код компилируется:
      {$APPTYPE CONSOLE}
      var
        u: longint;
       
      begin
        u := $;
        writeln(u);
      end.


      FPC и GPC такой код отвергают, потому что в них жуквери нет.
      Ответить
      • c++query

        https://ideone.com/Gg5rzC
        Ответить
      • В чём суть этого бакса?
        Ответить
        • для 16чной записи
          аналог крестоблядского 0x
          Ответить
          • Не очень аналогичный аналог.
            u = 0x; в крестах не скомпилируется
            Ответить
            • В ФПЦ тоже.
              Это дельфиний чисто баг. Кстати, по аналогии: 0x в билдере компилируется?
              Ответить
          • Гена, нам шапокляк дала $10. Каждому по восемь.
            Ответить
    • Давайте во все языки долларами хреначить!
      (defun $ (&rest args) args)
      Ответить
      • Об это зашкварились jquery, пыха, баш и слегка хацкил.
        Ну то есть те кому этих самых долларов не хватает.
        Люди за еду пишут, а доллары видят только в своем коде.
        Ответить
        • Вы назвали людей с разным уровнемм зарплаты в одном ряду.
          Из них все пишут за еду, кроме некоторых башистов, работающими за круглую сумму админами на удаленке. Ну а Хацкелстам еда не нужна. Им достаточно Борща и одобрение мамки.
          Ответить
          • >Ну а Хацкелстам еда не нужна.
            им нужна еда только когда они пойдут в туалет
            Ответить
        • Правильно. Пора вводить символ €, или, как крайний случай, ₪.

          for(₪i = 0;₪i < 10;₪i++);
          Ответить
          • Ответить
            • for (卐i=0; 卐i < 10; 卐i++) {
                  卐res .= 卐i;
              }
              Ответить
            • Хава нагила, хава нагила, хава нагила вэ нисмэха!
              Хава нэранэна, хава нэранэна, хава нэранэна вэ нисмэха!
              Уру ахим бэ лэв самэах, уру ахим бэ лэв самэах, уру ахим бэ лэв самэах!
              Ответить
      • Давайте!
        : $ ;
        У кого еще короче?

        Кстати в форте 2012 есть пасцалеликие констанции с $, версия gforth на tio.run имеет баг, что $ воспринимается как $0, в версии gforth на ideone такого бага уже нет.
        Ответить

    Добавить комментарий