Как каждый байт в целом числе хранится в процессоре / памяти?

StackOverflow https://stackoverflow.com/questions/1842187

  •  12-09-2019
  •  | 
  •  

Вопрос

я уже пробовал это

char c[4];
int i=89;
memcpy(&c[0],&i,4);
cout<<(int)c[0]<<endl;
cout<<(int)c[1]<<endl;
cout<<(int)c[2]<<endl;
cout<<(int)c[3]<<endl;

результат выглядит следующим образом:
89
0
0
0

что изрядно напрягает мой желудок, потому что я думал, что число будет сохранено в памяти, например 0x00000059 так почему же c [0] равно 89?я думал, это должно быть на c[3]...

Это было полезно?

Решение

Потому что процессор, на котором вы работаете, является литтл-эндиан.Порядок байтов многобайтового основного типа меняется местами.На машине большого класса все было бы так, как вы ожидаете.

Другие советы

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

Конечность, очевидно, является ответом, как указал Гоз.

Но для тех, кому неясно, что это значит, также важно понимать, что порядок байтов, отображаемых в примере, совпадает с порядком в исходном int.Memcpy не изменяет порядок байтов, независимо от типа edian платформы.

Потому что порядок байтов - это произвольное проектное решение.После того, как в регистре отсутствует порядок байтов1.

Порядок байтов возникает, когда мы обращаемся к меньшим единицам, таким как байты.Это по существу произвольное решение, которое должен принять разработчик процессора:большой конец или маленький конец.

Полезно упростить ситуацию и осознать, что в основном это упорядоченное по байтам подключение к периферийным устройствам.Да, это можно обнаружить с помощью байтовой адресации, как вы доказали, но в общем случае скалярные значения загружаются и хранятся в виде единиц измерения в регистрах, и в этом случае порядок байтов ничего не меняет.Наиболее значимые биты находятся "слева", по крайней мере, так, как мы обычно записываем числа.И вот почему << и >> операторы всегда выдают точно такие же результаты на машинах с большим и маленьким порядками при использовании в соответствии со стандартами языка.

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

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

Представьте себе процессор, в котором нет байтов, только 32-битные слова, адресуемые как 0, 1, 2.Компилятор C создает char, int и long для всех 32-разрядных объектов.(Это разрешено Cx9.) Вау, никаких проблем с порядком байтов!Это и то, и другое!Но ..что происходит, когда мы подключаем наше первое периферийное устройство??


1.Ну, в x86 есть регистры, которые являются псевдонимами регистров меньшего размера, но это уже другая история.

Разные машины могут иметь разный порядок байтов, но взгляните на этот код и подумайте о том, что происходит, в зависимости от того, как распределены байты:

long x = 89;
short *p = (short*)&x;
short y = *p;

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top