Как переводится более одного байта? - PullRequest
0 голосов
/ 08 февраля 2011

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

Ответы [ 7 ]

4 голосов
/ 08 февраля 2011

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

Видите, именно вы решаете, как обращаться с памятью.

1 голос
/ 08 февраля 2011

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

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

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

1 голос
/ 08 февраля 2011

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

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

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

0 голосов
/ 08 февраля 2011

Внутренне ЦП может быть подключен для извлечения 32 битов для целого числа, которое преобразуется в 4 8-битных октетов (байтов).Процессор не рассматривает выборку как 4 байта, а скорее 32 бита.

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

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

. Другие архитектуры процессоров могут извлекать 8 бит для символа.Это избавляет процессор от необходимости игнорировать 3 байта из 32-битной выборки.

Некоторые программисты просматривают целые числа по ширине байтов, а не битов.Таким образом, 32-разрядное целое число будет рассматриваться как 4 байта.Это может создать путаницу, особенно с порядком битов, иначе Endianess.Некоторые процессоры имеют первый байт, содержащий старшие значащие биты (Big Endian), в то время как другие имеют первый байт, представляющий младшие значащие биты (Little Endian).Это приводит к проблемам при передаче двоичных данных между платформами.

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

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

0 голосов
/ 08 февраля 2011

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

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

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

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

0 голосов
/ 08 февраля 2011

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

0 голосов
/ 08 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...