![Вычисление младшего значащего бита в режимах little endian и big endian](https://rvso.com/image/1395311/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BC%D0%BB%D0%B0%D0%B4%D1%88%D0%B5%D0%B3%D0%BE%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B0%D1%89%D0%B5%D0%B3%D0%BE%20%D0%B1%D0%B8%D1%82%D0%B0%20%D0%B2%20%D1%80%D0%B5%D0%B6%D0%B8%D0%BC%D0%B0%D1%85%20little%20endian%20%D0%B8%20big%20endian.png)
Из того, что я исследовал, следует, что 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 являются темой другого обсуждения, и для этого есть много источников в сети!
Надеюсь, это поможет хоть немного прояснить ситуацию!