
Из того, что я исследовал, следует, что Little Endian хранит младший значащий байт в наименьшем адресе памяти, тогда как Big Endian хранит старший значащий байт в наименьшем адресе памяти.
Однако я не понимаю, как подсчитывать и сравнивать значимые байты.
Например, отсюдасайтна рисунке ниже показано, как 4 байта, 90, AB, 12, CD, хранятся в адресах памяти в формате Little Endian.
Как мне сравнить, какой байт больше среди 4? Я сначала преобразовал все в шестнадцатеричные значения, а затем сравнил на основе их десятичных значений, но, похоже, это не работает таким образом.
205 > 18, однако CD хранится в наименьшем адресе памяти... так что... я ошибаюсь.
Любые разъяснения приветствуются.
Treating CD as a hex value, with a decimal value of 205.
Treating 12 as a hex value, with a decimal value of 18.
Treating AB as a hex value, with a decimal value of 171.
Treating 90 as a hex value, with a decimal value of 144.
решение1
Я думаю, что веб-страница, на которую вы ссылаетесь, содержит очень запутанное описание порядка байтов!
Фактическое значение отдельных байтов в слове не имеет никакого отношения к тому, где они хранятся в памяти, а имеет значение только их положение как части целого 4-байтового слова.
Порядок байтов применяется только к многобайтовым словам. В вашем случае у вас есть 4-байтовое слово, как показано ниже:
Decimal Hex Binary
2427130573 90 AB 12 CD 10010000 10101011 00010010 11001101
Это представление с обратным порядком байтов, в котором старший байт ( 0x90
) хранится первым в памяти или по самому младшему адресу памяти.
В представлении с прямым порядком байтов байты просто переставляются в памяти следующим образом:
Decimal Hex Binary
2427130573 CD 12 AB 90 11001101 00010010 10101011 10010000
Теперь младший байт ( 0xCD
) сохраняется первым в памяти или по самому младшему адресу памяти.
Вы видите, что фактические значения задействованных байтов определяют не их местоположение в памяти, а только их положение во всем слове.
Концепция порядка байтов восходит к архитектуре ЦП, как описано в статье, на которую вы ссылаетесь, и у обоих методов есть свои преимущества и недостатки.
Самый естественный способ для людей думать о числах — это в терминах big-endianness, потому что именно так мы относимся к десятичным числам. В вашем случае 2427130573
можно сказать, что десятичное число записано в big-endian нотации, то есть самая значимая цифра ( 2
) записывается первой, а значимость уменьшается по мере продвижения вправо (то есть изменение значения самой левой цифры имеет наибольшее значение для значения числа). Число может быть записано как слева направо, так и 3750317242
с наименее значимой цифрой первой, если вы знаете, как его читать таким образом (EDIT: кстати, именно поэтому файлы unicode должны иметь Byte Order Mark (BOM), хранящуюся в первых 2 байтах файла, чтобы операционная система знала, как интерпретировать файл.)
Однако для компьютеров, чтобы выполнять вычисления, часто наиболее эффективно хранить наименее значимый байт первым. Я думаю, что аргументы в пользу big vs little endianness являются темой другого обсуждения, и для этого есть много источников в сети!
Надеюсь, это поможет хоть немного прояснить ситуацию!