Размер char, int, long double … может варьироваться от одного компилятора к другому. Но есть ли у меня гарантия в соответствии со стандартом C ++ 11 или C11, что размер любого знакового и беззнакового фундаментального целочисленного типа одинаков?
Стандарт 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), который использует то же количество
хранение (включая информацию о знаке) и имеет те же требования выравнивания […]
Да, есть полная гарантия того, что sizeof (тип со знаком) равен sizeof (тип без знака) так как unsigned занимает только пространство отрицательных чисел со знаком типа, чтобы увеличить его диапазон.