(Этот вопрос возник из-за объяснения деталей CHAR_BIT, sizeof и порядка следования байтов кому-то вчера. Это совершенно гипотетически.)
Допустим, я на платформе, где CHAR_BIT равен 32, поэтому sizeof(char) == sizeof(short) == sizeof(int) == sizeof(long). Я считаю, что это все еще среда, соответствующая стандартам.
Обычный способ определения порядка байтов во время выполнения (потому что нет надежного способа сделать это во время компиляции) означает создать union { int i, char c[sizeof(int)] } x; x.i = 1
и посмотреть, установлены ли x.c[0]
или x.c[sizeof(int)-1]
.
Но это не работает на этой платформе, так как я получаю char[1].
Есть ли способ определить, является ли такая платформа обратным порядком байтов или прямым порядком байтов во время выполнения? Очевидно, внутри этой гипотетической системы это не имеет значения, но можно представить, что она записывает в файл или какую-то область памяти, которую другая машина читает и реконструирует в соответствии со своей (более разумной) моделью памяти.
AC_C_BIGENDIAN
autoconf, чтобы сделать это во время компиляции, он довольно надежен, прибегая к grep на тестовом двоичном файле, если он не может запустить код напрямую. - person Hasturkun   schedule 17.01.2011