Символ char
может быть размером одного байта, но когда дело доходит до четырех значений байта, например int
, как процессор отличает его от целого, а не четырех символов на каждый байт?Как переведено более одного байтового значения?
ответ
В общем, процессор сам по себе ничего не знает о интерпретации значений, хранящихся в определенных ячейках памяти, это код, который выполняется (генерируется в этом случае компилятором), что он должен знать об этом и использовать правильные CPU для управления такими значениями.
Чтобы сказать это по-другому, тип переменной является абстракцией языка, который сообщает компилятору, какой код генерировать для управления памятью.
Типы в некотором роде do существуют на уровне машинного кода: существуют различные инструкции для работы с различными типами - то есть, как интерпретируются исходные значения, хранящиеся в памяти, но это зависит от кода, выполняемого для использования правильного чтобы правильно обрабатывать значения, хранящиеся в памяти.
У компилятора есть таблица, которая называется «таблица символов», поэтому компилятор знает, какой тип является каждым var, и как он должен его рассматривать.
Вы задаете вопрос о дизайне процессора?
Каждая инструкция по машинной машине закодирована так, что CPU знает, сколько бит должно работать.
Компилятор C++ знает, как испускать 8-разрядные команды для char
и 32-разрядные инструкции для int
.
Это зависит от архитектуры. Большинство систем используют IEEE 754 Floating Point Representation и Two's Compliment для целых значений, но это зависит от рассматриваемого CPU. Он знает, как превратить эти байты в «значения» соответственно.
CPU выполняет код, который вы создали.
Этот код указывает процессору, как обрабатывать несколько байтов в определенной памяти, например «брать четыре байта по адресу 0x87367, рассматривать их как целое и добавлять их к значению».
См., Это вы решаете, как обращаться с памятью.
Вы должны были бы выровнять адрес :) – sbk
На стороне процессора это в основном относится к двум вещам: регистрам и набору команд (например, см. x86).
register - это всего лишь небольшой кусок памяти, который ближе всего к процессору. Значения помещаются туда и используются там для выполнения основных операций.
Набор инструкций будет содержать набор фиксированных имен (например, EAX, AX и т. Д.) Для адресации слотов памяти в регистре. В зависимости от имени они могут ссылаться на более короткие или более длинные слоты (например, 8 бит, 16, 32, 64 и т. Д.). В соответствии с этими регистрами существуют операции (например, сложение, умножение и т. Д.), Которые также действуют на значения регистров определенного размера. То, как процессор фактически выполняет инструкции или даже сохраняет регистры, не имеет значения (это зависит от производителя процессора), и программист (или компилятор) правильно использует набор инструкций.
Сам процессор не знает, что он делает (это не «разумно»), он просто выполняет операции по мере их запроса.Компилятор - это тот, который отслеживает типы переменных и гарантирует, что инструкции, которые сгенерированы и впоследствии выполнены программой, соответствуют тому, что вы закодировали (это называется «компиляция»). Но как только программа скомпилирована, CPU не «отслеживает» типы или размеры или что-то в этом роде (было бы слишком дорого для этого). Поскольку компиляторы в значительной степени гарантированно выполняют инструкции, которые являются последовательными, это не проблема. Конечно, если вы запрограммировали свой собственный код в сборке и использовали несоответствующие регистры и инструкции, CPU все равно не волновало бы, это просто заставило бы вас вести себя очень странно (вероятно, сбой).
Внутренне центральный процессор может быть подключен для извлечения 32 битов для целого числа, которое преобразуется в 4 8-битных октета (байты). ЦП не рассматривает выборку как 4 байта, а скорее 32 бита.
ЦП также внутренне подключен для извлечения 8 бит для символа (байта). Во многих процессорных архитектурах CPU извлекает 32 бита из памяти и внутренне игнорирует неиспользуемые биты (сохраняя младшие 8 бит). Это упрощает архитектуру процессора, только требуя выборки из 32 бит.
В эффективных платформах память также доступна в 32-битных количествах. Поток данных из памяти в процессор часто называют databus. В этом описании это будет 32 бита шириной.
Другие архитектуры процессоров могут отображать 8 бит для символа. Это устраняет необходимость игнорирования процессором 3 байта из 32-разрядной выборки.
Некоторые программисты видят целые числа в байтах, а не в битах. Таким образом, 32-битное целое число будет считаться 4 байтами. Это может создать путаницу, особенно с битовым упорядочением, a.k.a. Endianess. Некоторые процессоры имеют первый байт, содержащий наиболее значимые биты (Big Endian), в то время как другие имеют первый байт, представляющий наименее значимые биты (Little Endian). Это приводит к проблемам при передаче двоичных данных между платформами.
Зная, что целое число процессора может содержать 4 байта и что оно выбирает 4 байта за раз, многие программисты любят упаковывать 4 символа в целое число для повышения производительности. Таким образом, процессору потребуется 1 выборка для 4 символов, а не 4 выборки для 4 символов. Это повышение производительности может быть потрачено впустую на время выполнения, необходимое для упаковки и распаковки символов из целого.
В заключение я настоятельно рекомендую вам забыть о том, сколько байтов составляют целое число и какое-либо отношение к количеству символов или байтов. Эта концепция применима только для нескольких встроенных платформ или нескольких высокопроизводительных приложений. Ваша цель - доставить правильный и надежный код в течение заданной продолжительности. Проблемы с производительностью и размером находятся в конце проекта, но только в том случае, если кто-то жалуется. Вы преуспеете в своей карьере, если сосредоточьтесь на диапазоне и ограничениях целого числа, а не на том, сколько памяти оно занимает.
- 1. Как вернуть более одного значения?
- 2. Получение более одного значения
- 3. Печать более одного значения
- 4. уменьшить более одного значения
- 5. атрибут, имеющий более одного значения
- 6. C# EndsWith более одного значения
- 7. Javascript - Замените более одного значения
- 8. DataView.Count() возвращает более одного значения
- 9. Более одного значения, возвращаемого подзапросом
- 10. СЛУЧАЯ возвращает более одного значения
- 11. Выделить более одного значения массиву?
- 12. подзапрос возвращает более одного значения
- 13. Подзапрос возвращает более одного значения
- 14. Как назначить более одного значения к UInt32
- 15. Как отобразить более одного значения в таблице?
- 16. Как передать более одного значения во вход?
- 17. Как вернуть более одного значения в java?
- 18. Как назначить функцию, возвращающую более одного значения?
- 19. Как сортировать более одного значения в pyspark
- 20. как передать более одного значения в подзапросом
- 21. Как сохранить более одного значения для одного ключа в HashMap?
- 22. Сортировать Массив Карты более чем одного значения
- 23. Можно добавить String.contains более одного значения?
- 24. Функции в C, отправляющие более одного значения
- 25. Возврат более одного значения из функции JavaScript?
- 26. Ввести более одного значения в базу данных
- 27. Выбор более одного значения без флажков
- 28. Более одного значения для ключа user.name Git
- 29. Stencyl - получить более одного значения с карты
- 30. Удерживать более одного значения в сеансе?
Я думаю, что вопрос - это что-то вроде строк «Как ЦП знает разницу между int (4 байта) и 4 символами (4 байта)?» Но я мог бы уйти. – notJim
-1 ungrokkable question –
Это или как система представляет типы, о которых идет речь ... –