有符号整数和无符号整数之间的转换

Conversion between signed integer and unsigned integer

本文关键字:之间 转换 无符号整数 符号 整数      更新时间:2023-10-16

如果我将一个无符号整数强制转换为有符号整数,然后再强制转换,我能保证得到原始值吗?例如,根据C++标准,这个函数是否总是为任何平台上的任何x返回true

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));
}

对于fg,答案都是"不,这不保证"。

以下是标准对它的描述:

4.7积分转换

  1. 如果目标类型是无符号的,则得到的值是与源一致的最小无符号整数整数(模2n,其中n是用于表示无符号类型的位数)。[注:在两个补码表示,这种转换是概念性的,比特模式没有变化(如果没有截断)尾注]
  2. 如果目的地类型是签名的,则如果可以在目的地类型中表示,则该值不变;否则,该值由实现定义

第2节讨论函数g。在不使用二的补码表示的系统上,xunsigned的强制转换可能会导致表示的变化,因此将数字转换回可能会得到不同的值。

第三节讨论函数f。当数字超出signed int的范围时,结果是由实现定义的,因此不允许对将其转换回无符号的结果进行任何声明。