Все переменные типа int
имеют одинаковый размер; иначе говоря, для каждой переменной типа int
компилятор выделяет одинаковое количество памяти. В типичном настольном компьютере этот объем равен 4 байтам (32 бита). Аналогично, объекты типов bool
, char
и double
имеют фиксированный размер. В настольном компьютере переменные типа bool
и char
, как правило, занимают один байт (8 бит), а переменная типа double
— 8 байт. Обратите внимание на то, что разные типы объектов занимают разное количество памяти в компьютере. В частности, переменная типа char
занимает меньше памяти, чем переменная типа int
, а переменная типа string
отличается от переменных типов double
, int
и char
тем, что разные строки занимают разное количество памяти.
Смысл битов, размещенных в памяти, полностью зависит от типа, используемого для доступа к этим битам. Это следует понимать следующим образом: память компьютера ничего не знает о типах; это просто память, и больше ничего. Биты, расположенные в этой памяти, приобретают смысл, только когда мы решаем, как интерпретировать данный участок памяти. Такая ситуация вполне типична при повседневном использовании чисел. Что значит 12.5
? Мы не знаем. Это может быть 12.5
долл., 12.5
см или 12.5
галлонов. Только после того, как мы припишем числу 12.5
единицу измерения, оно приобретет конкретный смысл. Например, один и тот же набор битов в памяти может представлять число 120
, если его интерпретировать как переменную типа int
, и символ 'x'
, если трактовать его как объект типа char
. Если взглянуть на него как на объект типа string
, то он вообще потеряет смысл и попытка его использовать приведет к ошибке, возникшей в ходе выполнения программы. Эту ситуацию можно проиллюстрировать следующим образом (здесь 1 и 0 означают значения битов в памяти).
Этот набор битов, записанных в участке памяти (слове), можно прочитать как переменную типа int (120)
или char ('x')
, если учитывать только младшие биты. Бит — это единица памяти компьютера, которая может хранить либо 0, либо 1.
Смысл
3.9. Типовая безопасность
Каждый объект в ходе определения получает тип. Программа — или часть программы — является безопасной с точки зрения использования типов (type-safe), если объекты используются только в соответствии с правилами, предусмотренными для их типов. К сожалению, существуют операции, которые не являются безопасными с этой точки зрения. Например, использование переменной до ее инициализации не считается безопасным.
int main()
{
double x; // мы забыли проинициализировать переменную х:
// ее значение не определено
double y = x; // значение переменной y не определено
double z = 2.0+x; // смысл операции + и значение переменной z
// не определены
}
Компьютер может даже сообщить об ошибке аппаратного обеспечения при попытке использовать неинициализированную переменную х
. Всегда инициализируйте свои переменные! У этого правила есть лишь несколько — очень немного — исключений, например, если переменная немедленно используется для ввода данных. И все же инициализация переменных — это хорошая привычка, предотвращающая множество неприятностей. Полная типовая безопасность является идеалом и, следовательно, общим правилом для всех языков программирования. К сожалению, компилятор языка С++ не может гарантировать полную типовую безопасность, но мы можем избежать ее нарушения, используя хороший стиль программирования и проверку ошибок в ходе выполнения программы. Идеально было бы вообще никогда не использовать свойства языка, безопасность которых невозможно обеспечить с помощью компилятора. Такая типовая безопасность называется
Идеал типовой безопасности невероятно важен для создания кода. Вот почему мы поминаем о нем так рано. Пожалуйста, запомните об этой опасности и старайтесь избегать ее в своих программах.
3.9.1. Безопасные преобразования
В разделе 3.4 мы видели, что нельзя непосредственно складывать объекты типа char
или сравнивать объекты типов double
и int
. Однако в языке С++ это можно сделать косвенным образом. При необходимости объект типа char
можно преобразовать в объект типа int
, а объект типа int
— в объект типа double
. Рассмотрим пример.