我们知道,有符号整数溢出是未定义的行为。但在 C++11 的
typedef名称intN_t表示带有宽度N、没有填充位和二进制补码表示法的有符号整数类型。因此,int8_t表示具有确切8位宽度的这种有符号整数类型。
cstdint
文档中有一些有趣的内容:
有符号整数类型,宽度分别为 8、16、32 和 64 位,没有填充位,并且对于负值使用2的补码(仅当实现直接支持该类型时提供)
我的问题是:由于标准明确规定对于 int8_t
、int16_t
、int32_t
和 int64_t
,负数是采用2的补码,那么这些类型的溢出是否仍然是未定义的行为?
编辑 我查了一下 C++11 和 C11 标准,发现以下内容:
C++11,§18.4.1:
C11,§7.20.1.1:头文件定义了与 C 标准中的7.20相同的所有函数、类型和宏。
typedef名称intN_t表示带有宽度N、没有填充位和二进制补码表示法的有符号整数类型。因此,int8_t表示具有确切8位宽度的这种有符号整数类型。