有符号整数和无符号整数之间的转换
Conversion between signed integer and unsigned integer
如果我将一个无符号整数强制转换为有符号整数,然后再强制转换,我能保证得到原始值吗?例如,根据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));
}
对于f
和g
,答案都是"不,这不保证"。
以下是标准对它的描述:
4.7积分转换
- 如果目标类型是无符号的,则得到的值是与源一致的最小无符号整数整数(模2n,其中n是用于表示无符号类型的位数)。[注:在两个补码表示,这种转换是概念性的,比特模式没有变化(如果没有截断)尾注]
- 如果目的地类型是签名的,则如果可以在目的地类型中表示,则该值不变;否则,该值由实现定义
第2节讨论函数g
。在不使用二的补码表示的系统上,x
到unsigned
的强制转换可能会导致表示的变化,因此将数字转换回可能会得到不同的值。
第三节讨论函数f
。当数字超出signed int
的范围时,结果是由实现定义的,因此不允许对将其转换回无符号的结果进行任何声明。
相关文章:
- 在 Rcpp 中的字符串类型之间转换时出错
- r-在Rcpp和C++之间转换矢量(使用Rcpp::as或Rcpp:::wrap)是否会创建一个新的矢量并复制元素
- 在不同类型之间转换常量指针
- 在 3D 骨架系统 DirectX 之间转换
- C++ 如何将用户控件添加到窗体,以便我可以在面板之间转换
- 在 std::u8string 和 std::string 之间转换
- 如何在Unicode/UCS CodePoint和UTF16替代对之间转换
- 在DXGI格式之间转换RGBA数据
- 在两个不动点表达之间转换
- 在函数指针类型之间转换
- 代码的错误答案是在Java Camel案件和C 下划线标识符之间转换的错误答案
- 如何在C 中的不同类之间转换
- 一个关于C++中double和int之间转换的奇怪结果
- 模板类在模板类型之间转换,但也专门化
- 是否有Visual c++编译器在线,以及如何在c++和vs简单代码之间转换
- c/在Unix时间和"Gregorian time"之间转换
- 无法使用iconv在编码之间转换
- 在std::string和std::wstring之间转换的多平台方式
- 我真的应该每次在基元类型之间转换时都使用static_cast吗
- 使用Boost::units在两个量之间转换的最简单方法