2014-02-11 3 views
6

В настоящее время я пишу программу на языке C, включающую дело с байтами. Когда дело доходит до байтов, я действительно запутался в следующих вопросах.Как хранятся в памяти разные типы данных

  1. Сохранены ли символы в памяти по их кодам ascii? Скажем, что «A» имеет код anscii 65. Таким образом, он хранится в памяти так же, как целое число 65?

  2. Если да, то как машина отличает символ и целое число?

  3. Если символы хранятся в коде ascii, код ascii является целым числом. Целое число должно занимать не менее 2 байтов, почему персонаж занимает 1 байт?

  4. Последнее относится к целым числам на разных архитектурах. На 16-разрядной машине, если 1 хранится как 000 ... 0001, то на 32-битной машине 1 сохраняется еще так же, как только добавление 0 спереди?

+0

Машина не допускает различия между различными типами. Компилятор C++. – ApproachingDarknessFish

+0

@ValekHalfHeart Компилятор говорит разницу через тип объявления? – Xufeng

+0

Да, для этого и существует тип объявления. – ApproachingDarknessFish

ответ

9

Хранятся символы в памяти их ASCII-кодов? Say 'A' имеет anscii code 65. Значит, он хранится в памяти так же, как целое число 65?

Да, но char в С одного байта, в то время как int зависит от архитектуры машины.

Если да, то как машина отличает символ и целое число?

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

Если символы хранятся по кодам ascii, код ascii является целым числом. Целое число должно занимать не менее 2 байтов, как только символ только занимает 1 байт?

ASCII может поместиться в один байт (который является размер char). Работа с текстом, отличным от ASCII, сложнее в C. Существует wchar_t, который не переносится, и многие считают его сломанным. C11 вводит char16_t и char32_t, которые могут использоваться для UTF-16 и UTF-32 соответственно.

Последнее относится к целым числам на разных архитектурах. На 16-разрядной машине , если 1 хранится как 000 ... 0001, то на 32-битной машине есть 1 , все еще сохраненный таким же образом, просто добавив 0 спереди?

Это, в основном, верно, но это также зависит от архитектуры endianness.

+0

Лучше, чем тот, который я писал. – keshlam

+0

Итак, при хранении «А» и «65» разница в предыдущих 0 из 65 отбрасывается в «А»? – Xufeng

+1

Абсолютно никакой разницы между 'char a = 'A'' и' char a = 65'. Если вы спрашиваете о 'int a = 65', то да, он имеет дополнительные 0s. – imgx64

3
  1. Да, символы ASCII сохраняются по их значению. Но сохранение «A» (65 = 0x41) может отличаться от хранения самого 65, и как это делается, зависит от вашей машинной архитектуры.Символ может быть сохранен с одним байтом, тогда как int будет иметь как минимум 2 байта (чаще всего 4 байта в современных машинах), и поэтому они могут храниться по-разному.

  2. Это не так. Мы могли бы иметь память, равную 0x41. Единственный способ, которым это отличается между «A» и «65», основан на том, как вы объявили его компилятору. Другими словами, если вы объявили переменную как int, она будет рассматриваться как int.

  3. Существует так мало значений ASCII, что вы можете представить все возможности с менее чем 8 бит. Таким образом, использование 16 бит для представления этого было бы пустой тратой памяти. В современных системах это уже не так много, но в системах с ограниченной памятью вы можете использовать этот дополнительный байт для чего-то другого, а не для пустого пространства.

  4. Более-менее, да. 1 всегда будет храниться как 0000 .... 1, так что общее количество двоичных цифр там равно заполняет пространство для int. Таким образом, на 8-битной системе, которая будет 00000000 и 00000001 в двух словах, на 16-битной системе, которая будет на 000000000000001 на одно слово.

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