Endianness - почему символы помещают в печать Int16 задом наперед? - PullRequest
1 голос
/ 21 октября 2011

Следующий код C, скомпилированный и запущенный в XCode:

UInt16 chars = 'ab';
printf("\nchars: %2.2s", (char*)&chars);

печатает 'ba', а не 'ab'.

Почему?

Ответы [ 4 ]

1 голос
/ 22 октября 2011

Эта конкретная реализация, кажется, хранит многосимвольные константы в формате с прямым порядком байтов.В константе 'ab' символ 'b' является наименее значимым байтом (младший конец), а символ 'a' является наиболее значимым байтом.Если бы вы рассматривали chars как массив, это были бы chars[0] = 'b' и chars[1] = 'a', и, таким образом, printf рассматривал бы как "ba".

Кроме того, я не уверен, насколько вы точнырассмотрим Википедию, но в отношении C синтаксиса она имеет следующий раздел:

Многосимвольные константы (например, 'xy') допустимы, хотя и редко полезны - они позволяют одному хранить несколько символовв целое число (например, 4 символа ASCII могут помещаться в 32-разрядное целое число, 8 в 64-разрядное).Поскольку порядок, в котором символы упакованы в одно целое, не указан, использование многосимвольных констант в переносном режиме затруднено.

Таким образом, следует избегать формата многосимвольных констант 'ab'.в общем.

1 голос
/ 21 октября 2011

Это зависит от системы, в которой вы компилируете / запускаете вашу программу.

Очевидно, что в вашей системе короткое значение сохраняется в памяти как 0x6261 (ba): прямой порядок байтов.

Когда вы просите декодировать строку, printf будет читать побайтно значение, которое вы сохранили в памяти, которое на самом деле равно «b», а затем «a». Таким образом, ваш результат.

1 голос
/ 21 октября 2011

Символьные литералы, состоящие из множества символовсимвольная или escape-последовательность, которая не отображается на однобайтовый символ выполнения, определяется реализацией. "

gcc и icl print ba в Windows 7. tcc печатает a и удаляетвторая буква в целом ...

0 голосов
/ 21 октября 2011

Ответ на ваш вопрос можно найти в ваших тегах: Endianness .На машине с прямым порядком байтов младший байт сохраняется первым.Это соглашение и не влияет на эффективность вообще.

Конечно, это означает, что вы не можете просто привести его к символьной строке, поскольку порядок символов неправильный, поскольку в символьной строке нет значащих байтов, а есть только последовательность.

Если вы хотите просмотреть байты в вашей переменной, я предлагаю использовать отладчик, который может считывать фактические байты.

...