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

    +133

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    #if __BYTE_ORDER == __BIG_ENDIAN
    struct DWstruct { Wtype high, low;};
    #elif __BYTE_ORDER == __LITTLE_ENDIAN
    struct DWstruct { Wtype low, high;};
    #else
    #error Unhandled endianity
    #endif

    glibc, sysdeps/wordsize-32/divdi3.c

    Запостил: bormand, 24 Января 2013

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

    • И в чём ГК?
      Ответить
      • есть подозрение
        думаю в том, что DW - double word, а W - word
        обычно double word - 4 байта, а word - 2 байта, и поэтому в DW надо на 4 части делить, а не просто поменять местами двухбайтные половины
        это если в общем, а как конкретно используется эта поебень - bormand его знает
        Ответить
        • Ну, я думаю, что Wtype реализован аналогично. То есть это тоже структура с верхним и нижним байтами.

          (Хм... верхний и нижний байт... какой подтекст, а.)
          Ответить
        • Не, это не ради перестановки. Wtype - 32 битное целое. DWtype - 64. Сама функция - это софтовое деление двух 64-битных чисел. Вот чтобы правильно разбить 64-битное число на две половинки и используется эта структура.
          Ответить
      • В unhandled endianity. Откуда взяться третьему варианту?
        Ответить
        • Например, если среда не определяет __BYTE_ORDER. Насколько я понимаю, это не часть POSIX, так что гарантий нет.

          http://unixpapa.com/incnote/byteorder.html
          Ответить
          • > Например, если среда не определяет __BYTE_ORDER
            Я так понимаю индейцев проверяет еще и configure, поэтому если индейцы не из двух известных нам племён - все сломается гораздо раньше, еще на этапе конфигурирования (или же configure ее добавит самостоятельно).
            Ответить
        • На PDP-11 смешанный порядок был, его не поддерживают
          Ответить
          • значит надо #if заменять на if
            Ответить
          • Ну он и не 32-битный, чтобы лежать в каталоге wordsize-32... Да и с тех пор индейцев племени middle-endian (PDP-endian) никто не видел.
            Ответить
            • хм, выкыпедия говорит что мол некоторые армы имеют такой порядок,правда для плавающей запятой
              Ответить
          • Это как? Типа операция чтения числа из памяти в регистр имела параметр индейскости?
            Ответить
            • например есть жирное число на 4 байта, агрегат 16ти битный, так вот это число разбивается на две половинки, причем половинки лежат в порядке big-endian, а байты в половинках в другом порядке(или наоборот), вроде как то так
              Ответить

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