sizeof (int) <= sizeof (long) <= sizeof (long long) всегда верно? - PullRequest
4 голосов
/ 06 августа 2009

По стандарту C, int имеет как минимум 16-битный, long - как минимум 32-битный и как минимум 64-битный long (если есть) (некоторые платформы могут не поддерживать). Просто интересно, если предложение в качестве заголовка всегда верно.

Ответы [ 4 ]

18 голосов
/ 06 августа 2009

Нет. Стандарт определяет только минимальные диапазоны для каждого из этих типов. Возможно, int может иметь 16-битный диапазон, но 48-битный заполнитель, доводя его до 64-бит (8 байт, если CHAR_BITS == 8), а long - 32-бит (4 байта).

Конечно, это было бы глупо. Но это не запрещено как таковое.

Обратите внимание, однако, что sizeof(char) == 1 по определению. Так что sizeof(char) <= sizeof( что-нибудь еще ).

6 голосов
/ 06 августа 2009

Согласно C Таблицы программирования / справки , в частности Таблица типов данных :

int ≥ 16 ≥ размер короткого

long ≥ 32 ≥ размер int

длинный длинный ≥ 64 ≥ размер длинный

Как указал bdonlan, это относится только к диапазону значений, а не к размеру в памяти (который sizeof возвращает в байтах). Стандарт C не определяет размер памяти, который может использовать каждый тип, поэтому он оставлен на усмотрение.

2 голосов
/ 06 августа 2009

По крайней мере для ISO C ++ это четко определено (за исключением long long по понятным причинам) стандартом в 3.9.1 [basic.fundamental] / 2:

Существует четыре типа целых чисел со знаком: «знаковый символ», «короткое целое», «int» и «длинное целое». В этом списке каждый тип предоставляет как минимум столько же памяти , сколько предшествует этому в списке.

Обратите внимание, что речь идет о хранилище, а не диапазонах значений. Это конкретно означает sizeof.

2 голосов
/ 06 августа 2009

Практическое программирование на C ++ говорит, что

C ++ гарантирует, что хранилище для short <= <strong>int <= <strong>long

Все еще в поисках long long .

...