У меня есть гарантия, что sizeof (тип) == sizeof (тип без знака)?

Размер char, int, long double … может варьироваться от одного компилятора к другому. Но есть ли у меня гарантия в соответствии со стандартом C ++ 11 или C11, что размер любого знакового и беззнакового фундаментального целочисленного типа одинаков?

24

Решение

Стандарт C ++ 11 говорит о целочисленных типах:

(§3.9.1 / 3) Для каждого из стандартных целочисленных типов со знаком существует соответствующий (но различный) стандартный целочисленный тип без знака: «unsigned char», «unsigned short int», «unsigned int», «unsigned long int» »И« unsigned long long int », каждый из которых занимает тот же объем памяти и имеет те же требования выравнивания (3.11), что и соответствующий тип целого числа со знаком; то есть каждый тип целого числа со знаком имеет то же представление объекта, что и соответствующий ему тип целого числа без знака. Аналогично, для каждого из расширенных целочисленных типов со знаком существует соответствующий расширенный целочисленный тип без знака с тем же объемом памяти и требованиями выравнивания. […]

Так что ответ — да.

Для C11 здесь есть соответствующее утверждение (это из N1570):

(§6.2.5 / 6) Для каждого из целочисленных типов со знаком существует соответствующий (но другой) без знака
целочисленный тип (обозначаемый ключевым словом unsigned), который использует то же количество
хранение (включая информацию о знаке) и имеет те же требования выравнивания […]

41

Другие решения

Да, есть полная гарантия того, что sizeof (тип со знаком) равен sizeof (тип без знака) так как unsigned занимает только пространство отрицательных чисел со знаком типа, чтобы увеличить его диапазон.

-1

По вопросам рекламы [email protected]