Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Стандарт С++ 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), который использует такое же количество (включая информацию о знаке) и имеет те же требования к выравниванию [...]

Ответ 2

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