Каждый целочисленный тип, который больше, чем char, учитывает концепцию младшего и старшего порядкового номера.
Когда вы пишете код на C, вам не нужно беспокоиться о младшем и старшем порядке. Например, если у вас есть int X=100, Y=200;
, то X+Y
будет постоянно возвращать 300, для каждой реализации C.
Однако, когда вам нужно передать данные между машинами, вы должны принять во внимание, что вы можете получать данные, поступающие с прямым порядком байтов на большой порядковый номер машины и наоборот. В этом случае вам нужно преобразовать байты от младшего к старшему (для этого библиотека сокетов имеет специализированные функции).
С другой стороны, в C целое число типа int
хранится не в 16 битах, а как минимум в 16 битах.
Чтобы увидеть, является ли машина младшим или старшим порядковым номером, вы можете инициализировать значение X с 256 и извлечь первые 8 бит и посмотреть, равны ли они 0 или нет. *((unsigned char*)&X)&((1<<8)-1))!=0
. В зависимости от результата этого выражения вы определяете макрос LITTLE_ENDIAN или BIG_ENDIAN
Чтобы прочитать каждый байт целого числа, вы можете определить структуру, подобную этой
typedef struct {
#if LITTLE_ENDIAN
unsigned char low;
unsigned char high;
#elif BIG_ENDIAN
unsigned char high;
unsigned char low;
#endif
} order_integer;
тогда вы можете заказать целое число, используя
x=400;
order_integer *o=(order_integer*)&x;
printf("%u %u\n", o->low, o->high);
Если вы хотите прочитать целое число из адресов 124 и 125 (предположим, что вы проверили и уверены, что sizeof int = 2), то вы можете сделать это:
order_integer *o = (order_integer*)124;
printf("%u %u\n", o->low, o->high);