在C ++ 11 cstdint
文档中有一些有趣的地方:
有符号整数类型,其宽度分别为8,16,32和64位,分别没有填充位,使用2的补码作为负值(仅当实现直接支持该类型时才提供)
由于标准明确地说,对int8_t
,int16_t
,int32_t
和int64_t
负数是2的补码,他们还是未定义的行为吗?
发布于 2018-04-16 16:37:13
他们还是未定义的行为吗?
是。根据C++ 11标准:
如果在评估表达式时,结果不是数学上定义的,或者不在其类型的可表示值范围内,则行为是未定义的。[...]
对这些有符号类型使用二进制补码表示的事实并不意味着在评估这些类型的表达式时使用算术模2^n。
另一方面,关于无符号算术,标准明确规定:
无符号整数,声明
unsigned
,应服从算术模2 ^ n的定律,其中n是特定大小整数的值表示中的位数
这意味着无符号算术运算的结果总是“ 数学定义的 ”。
https://stackoverflow.com/questions/-100008123
复制相似问题