1. Си / Говнокод #17286

    +136

    1. 1
    2. 2
    /* To the unenlightened: This sets the 20 MSBs to 0 for sanity's sake. */
    return four_bytes_to_uint32(four_byte_array) & ~(~0 << 12);

    Так приказали K&R.

    Запостил: codemonkey, 10 Декабря 2014

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

    • А почему не &0xfff?
      Ответить
      • Чтобы если/когда понадобиться 16, 20, 3.1415 бит урезать, не ебаться с вычислением константы, а заменить число сдвигов.
        Ответить
        • А прикольно. Я обычно (1<<12)-1 делаю, но для 16 бит мой вариант не прокатит, а этот прокатит.
          Ответить
          • почему для 16 бит не прокатит?
            Ответить
            • хм. я уже привык что int=16 бит. на 32-битных архитектурах - для 32-х бит.
              ---
              С другой стороны, сдвиг на 32 это наверное UB, так что все равно не пойдет.
              Ответить
              • > сдвиг на 32 это наверное UB
                Implementation defined вроде, но не особо лучше UB'а. Где-то зануляет регистр, как и положено (вроде бы, если числа - константы, то так и будет), где-то вообще ничего не делает (barrel shifter'ы x86 и многих других процов тупо обрезают сдвиг на 5 (32-битный регистр) или 6 (64-битный регистр) бит, поэтому в 32-битном режиме a << 32 == a << 0, a << 33 == a << 1 и т.п.).
                Ответить
                • >The integer promotions are performed on each of the operands. The type of the result is that of the promoted left operand. If the value of the right operand is negative or is greater than or equal to the width of the promoted left operand, the behavior is undefined

                  Так что UB, компилятор может смело форматировать диск.
                  Ответить
                  • > компилятор может смело форматировать диск
                    Надо написать такой компилятор для отучения от UB'ов.
                    Ответить
                    • Кто им будет пользоваться?
                      План должен быть чуть сложнее:
                      а) пишем компилятор, которым все хотят и будут пользоваться
                      б) в (авто!)обновлении добавляем UB, который ворует и высылает нам пароли и номера кредиток
                      Ответить
        • Ебаться?
          С вычислением?
          Да ладно, эти константы за секунду в уме просчитываются.
          Ответить
    • > four_bytes_to_uint32

      Big-endian или little-endian?
      Ответить

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