О размере типов int и long

Типы int и long (он же long int) хорошо знакомы каждому программисту C/C++. Их размер и диапазон возможных значений описываются в каждой книге по С/С++. Но оказывается то, что написано в книгах не всегда соответствует действительности.

Начнем с типа int. В книге Герберта Шилдта (полный справочник по C++) для него указывается «обычный размер» 16 или 32 бита. Там же говорится: «стандарт требует, чтобы переменная типа int имела естественный размер, соответствующий архитектуре операционной системы». Я если честно не знаю, какой «естественный размер» у операционных систем Windows и Linux, но во всех моих тестах переменная типа int имела размер 32 бита. Она определялась для следующих случаев:

    • компилятор g++ для Linux 64 бита;
    • компилятор g++ для Linux 32 бита (ключ -m32);
    • компиляторы mingw в среде Linux (Linux Mint 18.2 Sonya 64-bit) при генерации кода для Windows 32 и 64 бита;
    • среда Microsoft Visual Studio 2017 при генерации 32 битного и 64 битного кода;
    • среда Embarcadero RAD Studio 10 при генерации 32 битного и 64 битного кода;
    • среда Dev-C++ при генерации 32 битного и 64 битного кода;
    • среда C++ Builder 6.

В общем, как бы я не исхитрялся размер типа int всегда был 32 бита.

С типом long все интереснее. У Шилдта для него указывается «обычный размер» 32 бита. Я просмотрел еще несколько источников в Интернете. Везде указывается размер 32 бита. Но что показали мои эксперименты? Во всех компиляторах (для которых я тестировал) в среде Windows его размер действительно 32 бита. Но не для g++ в Linux. В нем размер типа long соответствует разрядности целевой машины. То есть, когда я генерировал 64-разрядный код, его размер — 64 бита, когда генерировал 32-битный код — 32 бита.

У Шилдта говорится: «В стандарте языка С++ минимальный размер и диапазон изменения переменных, имеющих элементарный тип, не определен». Поэтому нельзя однозначно сказать какой из компиляторов нарушает стандарт.

Один ответ

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *