2011-02-07 2 views
0

Символ char может быть размером одного байта, но когда дело доходит до четырех значений байта, например int, как процессор отличает его от целого, а не четырех символов на каждый байт?Как переведено более одного байтового значения?

+2

Я думаю, что вопрос - это что-то вроде строк «Как ЦП знает разницу между int (4 байта) и 4 символами (4 байта)?» Но я мог бы уйти. – notJim

+1

-1 ungrokkable question –

+0

Это или как система представляет типы, о которых идет речь ... –

ответ

1

В общем, процессор сам по себе ничего не знает о интерпретации значений, хранящихся в определенных ячейках памяти, это код, который выполняется (генерируется в этом случае компилятором), что он должен знать об этом и использовать правильные CPU для управления такими значениями.

Чтобы сказать это по-другому, тип переменной является абстракцией языка, который сообщает компилятору, какой код генерировать для управления памятью.

Типы в некотором роде do существуют на уровне машинного кода: существуют различные инструкции для работы с различными типами - то есть, как интерпретируются исходные значения, хранящиеся в памяти, но это зависит от кода, выполняемого для использования правильного чтобы правильно обрабатывать значения, хранящиеся в памяти.

0

У компилятора есть таблица, которая называется «таблица символов», поэтому компилятор знает, какой тип является каждым var, и как он должен его рассматривать.

1

Вы задаете вопрос о дизайне процессора?

Каждая инструкция по машинной машине закодирована так, что CPU знает, сколько бит должно работать.

Компилятор C++ знает, как испускать 8-разрядные команды для char и 32-разрядные инструкции для int.

0

Это зависит от архитектуры. Большинство систем используют IEEE 754 Floating Point Representation и Two's Compliment для целых значений, но это зависит от рассматриваемого CPU. Он знает, как превратить эти байты в «значения» соответственно.

4

CPU выполняет код, который вы создали.
Этот код указывает процессору, как обрабатывать несколько байтов в определенной памяти, например «брать четыре байта по адресу 0x87367, рассматривать их как целое и добавлять их к значению».

См., Это вы решаете, как обращаться с памятью.

+0

Вы должны были бы выровнять адрес :) – sbk

0

На стороне процессора это в основном относится к двум вещам: регистрам и набору команд (например, см. x86).

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

Набор инструкций будет содержать набор фиксированных имен (например, EAX, AX и т. Д.) Для адресации слотов памяти в регистре. В зависимости от имени они могут ссылаться на более короткие или более длинные слоты (например, 8 бит, 16, 32, 64 и т. Д.). В соответствии с этими регистрами существуют операции (например, сложение, умножение и т. Д.), Которые также действуют на значения регистров определенного размера. То, как процессор фактически выполняет инструкции или даже сохраняет регистры, не имеет значения (это зависит от производителя процессора), и программист (или компилятор) правильно использует набор инструкций.

Сам процессор не знает, что он делает (это не «разумно»), он просто выполняет операции по мере их запроса.Компилятор - это тот, который отслеживает типы переменных и гарантирует, что инструкции, которые сгенерированы и впоследствии выполнены программой, соответствуют тому, что вы закодировали (это называется «компиляция»). Но как только программа скомпилирована, CPU не «отслеживает» типы или размеры или что-то в этом роде (было бы слишком дорого для этого). Поскольку компиляторы в значительной степени гарантированно выполняют инструкции, которые являются последовательными, это не проблема. Конечно, если вы запрограммировали свой собственный код в сборке и использовали несоответствующие регистры и инструкции, CPU все равно не волновало бы, это просто заставило бы вас вести себя очень странно (вероятно, сбой).

0

Внутренне центральный процессор может быть подключен для извлечения 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 символов. Это повышение производительности может быть потрачено впустую на время выполнения, необходимое для упаковки и распаковки символов из целого.

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

Смежные вопросы