О размере типов 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 бита.

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

Один ответ

Добавить комментарий для Vvv Отменить ответ

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