如果我将一个无符号整数转换为一个有符号整数,然后再转换回来,我能保证得到原始值吗?例如,此函数是否总是返回 true 对于任何 x 根据C++标准,在任何平台上?
true
x
bool f(unsigned int x) { return x == static_cast<unsigned int>(static_cast<int>(x)); }
这个怎么样?
bool g(int x) { return x == static_cast<int>(static_cast<unsigned int>(x)); }
答案是“不,这不保证” f 和 g .
f
g
以下是标准对此的说明:
4.7积分转换 如果目标类型是无符号的,则结果值是与源类型一致的最小无符号整数 整数(模2 n 其中n是用于表示无符号类型的位数)。[注:两秒钟内 补码表示,这种转换是概念性的,位模式没有变化(如果没有截断)。尾注] 如果目标类型是有符号的,如果可以在目标类型中表示,则该值不变;否则,该值是实现定义的。
第2节讨论功能 克 .演员阵容 x 到 unsigned 在不使用二的补码表示法的系统上,可能会导致表示法的改变,因此将数字转换回可能会得到不同的值。
克
unsigned
第3节讨论功能 f .当号码在外时 signed int 的范围,则结果是实现定义的,因此不允许对将其转换回无符号的结果进行任何声明。
signed int