Я проверяю порядок байтов с условием ((char)((int)511) == (char)255)
.True означает маленький, false означает большой.
Я проверил это на нескольких отдельных системах, как малых, так и больших, используя gcc с отключенной оптимизацией и макс.В каждом тесте, который я проводил, я получал правильные результаты.
Вы могли бы поместить это условие в if вашего приложения до того, как оно должно будет выполнять операции с критическим порядком байтов.Если вы хотите только гарантировать, что вы используете правильный порядок байтов для всего вашего приложения, вы можете вместо этого использовать статический метод утверждения, такой как:
extern char ASSERTION__LITTLE_ENDIAN[((char)((int)511) == (char)255)?1:-1];
Эта строка в глобальной области действия создаст компиляциюошибка, если система не имеет порядка байтов и будет отказываться от компиляции.Если ошибки не было, она прекрасно компилируется, как если бы эта строка не существовала.Я нахожу, что сообщение об ошибке довольно наглядно:
error: size of array 'ASSERTION__LITTLE_ENDIAN' is negative
Теперь, если вы не знаете, как ваш компилятор оптимизирует фактическую проверку, как я, вы можете сделать следующее:
int endian;
{
int i = 255;
char * c = &i;
endian = (c[0] == (char)255);
}
if(endian) // if endian is little
Что хорошо сжимается в этот макрос:
#define isLittleEndian(e) int e; { int i = 255; char * c = &i; e = (c[0] == (char)255); }
isLittleEndian(endian);
if(endian) // if endian is little
Или, если вы используете GCC, вы можете сойти с:
#define isLittleEndian ({int i = 255; char * c = &i; (c[0] == (char)255);})
if(isLittleEndian) // if endian is little