2014-09-25 4 views
1

Предположим, я хочу написать минимальный стандартный компилятор , и я дошел до того, что мне нужно реализовать интегральные типы. Правильно ли я предполагаю, что я могу минимизировать размеры интегральных типов в соответствии с этой таблицей?Минимальные размеры для интегральных типов

char: стандартные мандаты sizeof(char) всегда 1. Поэтому 1 байт.

short: должно быть не менее 2 байт. Поэтому 2 байта.

int: должно быть не меньше short. Поэтому 2 байта.

long: должно быть не меньше int. Поэтому 2 байта.

long long: должно быть длиннее long. Поэтому 17 бит (т. Е. -65536 до +65535), если я реализую два комплимента: I думаю это выбор, который я могу сделать).

bool: стандарт не определяет размер. Поэтому 1 бит.

Я знаю, что мне не нужно поддерживать std::int64_t и его двоюродный брат без знака. Нужно ли мне поддерживать std::int32_t или это усмотрение компилятора?

+2

О выглядеть ад ++. –

+0

+1 - черт возьми - я знаю, но это больше, чем детское любопытство: я строю сериализатор, и я мог бы понять, что нижние границы теоретические. –

+1

http://en.wikipedia.org/wiki/C_data_types - вы совсем не согласны с требованиями (связанная страница предназначена для C, но относится к C++). – Mat

ответ

2

enter image description here

Фактический размер целочисленных типов варьируется в зависимости от реализации. Стандарт требует только размера отношений между типами данных и минимальных размерами для каждого типа данных:

Требования соотношения в том, что long long не меньше, чем long, который не меньше, чем int, что не меньше, чем short. Поскольку размер char - это минимально поддерживаемый тип данных, все остальные типы данных не могут быть меньше.

Минимальный размер char составляет 8 бит, минимальный размер для short и int составляет 16 бит, для long это 32 бита и long long должны содержать, по меньшей мере, 64 бита.


Чтобы получить макс/мин число для каждого типа можно назвать:

#include <limits> 
const int min_int = std::numeric_limits<int>::min(); 
const int max_int = std::numeric_limits<int>::max(); 

или C раствор:

#include <limits.h> 
const int min_int = INT_MIN; 
const int max_int = INT_MAX; 
Смежные вопросы