【问题标题】:Do I have the guarantee that sizeof(type) == sizeof(unsigned type)?我能保证 sizeof(type) == sizeof(unsigned type) 吗?
【发布时间】:2012-10-21 14:10:08
【问题描述】:

char、int、long double... 的大小可能因编译器而异。但是我是否根据 C++11 或 C11 标准保证任何有符号和无符号基本整数类型的大小相同?

【问题讨论】:

  • 我希望如此,除非有某种类型对不等式有意义,在这种情况下,我会很高兴听到它。
  • 顺便说一句,char 的 sizeof 始终为 1。char 可以有不寻常的大小,如 16 位,但 sizeof char 仍为 1,而 32 位类型的 sizeof 为 2。跨度>

标签: c++ c sizeof language-lawyer standards-compliance


【解决方案1】:

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 指定) 存储(包括标志信息)并具有相同的对齐要求 [...]

【讨论】:

    【解决方案2】:

    是的,可以完全保证 sizeof(signed type) 等于 sizeof(unsigned type),因为 unsigned 只占用有符号类型的负数空间来增加其范围。

    【讨论】:

    • 标准中没有任何内容要求UINT_MAX > INT_MAX;符号大小机器可以使它们相等。
    猜你喜欢
    • 1970-01-01
    • 2019-10-18
    • 2012-01-08
    • 1970-01-01
    • 2020-02-18
    • 2013-10-20
    • 2015-02-12
    • 1970-01-01
    • 2012-02-13
    相关资源
    最近更新 更多