char、int、long double…的大小可能因编译器而异。但是我是否可以根据C 11或C11标准保证任何有符号和无符号基本整数类型的大小都是相同的?
C 11标准谈到整数类型:
(§3.9.1/3)对于每种标准有符号整数类型,都存在一个对应的(但不同的)标准无符号整数类型:“无符号char”、“无符号短整数”、“无符号整数”、“无符号长整数”和“无符号长整数”,每种类型都占用相同的存储量,并且具有与相应的有符号整数类型相同的对齐要求(3.11);也就是说,每种有符号整数类型都具有与其对应的无符号整数类型相同的对象表示。同样,对于每种扩展的有符号整数类型,都存在具有相同存储量和对齐要求的相应扩展无符号整数类型。[…]
所以答案是肯定的。
对于C11,这里有一个相应的语句(来自N1570):
(§6.2.5/6)对于每种有符号整数类型,都有一个对应的(但不同的)无符号整数类型(用关键字无符号指定),它使用相同的存储量(包括符号信息)并具有相同的对齐要求[…]
是的,可以完全保证sizeof(有符号类型)等于sizeof(无符号类型),因为无符号只占用有符号类型的负数的空间来增加其范围。