Порядковый порядок при преобразовании массива из двух байтов в один короткий - PullRequest
0 голосов
/ 21 июля 2009

Проблема: Я не могу понять число 256 (2 ^ 8) в выдержке из статьи IBM :

С другой стороны, если это система с прямым порядком байтов, старший байт равен 1 и значение х составляет 256.

Предположим, что каждый элемент в массиве потребляет 4 байта, тогда процессор должен как-то прочитать: 1000 0000. Если это большой порядковый номер, это 0001 0000, потому что порядковый номер не влияет на биты внутри байтов. [2] Противоречие с 256 в статье!?

Вопрос: Почему число 256_dec (= 1000 0000_bin), а не 32_dec (= 0001 0000_bin)?

[2] Проблемы с порядком байтов не влияют на последовательности, которые имеют отдельные байты, поскольку «байт» считается атомарной единицей с точки зрения хранения.

Ответы [ 3 ]

2 голосов
/ 21 июля 2009

Поскольку байт равен 8 битам, а не 4. 9-й младший значащий бит в целом без знака будет иметь значение 2 ^ (9-1) = 256. (наименее значимое имеет значение 2 ^ (1-1) = 1).

Из статьи IBM:

unsigned char endian[2] = {1, 0};
short x;

x = *(short *) endian;

Они правы; значение (короткое) 256 для старшего байта или (короткое) 1 для младшего байта.

Запись битов, это массив {00000001_ {base2}, 00000000_ {base2}}. Big endian будет интерпретировать этот битовый массив, читаемый слева направо; little endian поменяет местами два байта.

1 голос
/ 21 июля 2009

256 dec - это не 1000_0000 bin , это 0000_0001_0000_0000 bin .

С замененными байтами (1 байт = 8 бит) это выглядит как 0000_0000_0000_0001 bin , что составляет 1 dec .

1 голос
/ 21 июля 2009

Отвечая на ваш вопрос: вкратце, в большинстве языков программирования отсутствует «размер элемента в массиве по умолчанию».

В C (возможно, самый популярный язык программирования) размер элемента массива - или что-то, действительно - зависит от его типа. Для массива char элементы обычно 1 байт. Но для других типов размер каждого элемента равен объему, который дает оператор sizeof (). Например, многие реализации C дают sizeof (short) == 2, поэтому, если вы создадите массив short, он будет занимать 2 * N байтов памяти, где N - количество элементов.

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

Надеюсь, это поможет. (Другие комментарии я не видел, пока не написал первую версию.)

...