Строго говоря, единственный метод, который полностью совместим с ANSI C, - это перебирать все возможные значения int и проверять, все ли они соответствуют желаемому представлению. Тем не менее, если вы можете предположить, что все системы, в которых вы будете работать, имеют порядок с прямым или обратным порядком байтов или со смешанным порядком байтов (т. Е. Ничего странного, как кодирование с серым или BCD), вы можете просто сделать что-то вроде этого:
static const unsigned int testvec = 0x01020304;
static const unsigned char letest[4] = { 0x04, 0x03, 0x02, 0x01 };
static const unsigned char betest[4] = { 0x01, 0x02, 0x03, 0x04 };
int isle() {
return !memcmp(&testvec, letest, 4);
}
int isbe() {
return !memcmp(&testvec, betest, 4);
}
Обратите внимание, что если вы не смотрите на представление байтов (то есть, если вы не приводите указатели для просмотра необработанных байтов), вы не можете сказать, какой порядок байтов используется. 0x0001 & 0x1000
равно 0
во всех реализациях C, потому что и 0x0001
, и 0x1000
одинаково заменены байтами (а также потому, что младшее порядковое представление 0x0001
равно 01 00
, а не 10 00
).