繁体   English   中英

C++ 将无符号转换为有符号整数的可移植性

[英]C++ Converting unsigned to signed integer portability

我知道在 C 中,无符号到有符号整数的转换是实现定义的,但是 C++ 是什么? 我想已经有人问过这个问题了,我搜索了但找不到。

我有一个对无符号整数进行运算并返回相关无符号整数的函数。 我通过转换为类似于int num = -6; unsigned ret = func((unsigned)num); int ret_as_signed = (int)ret;无符号来传递该函数一个有符号整数int num = -6; unsigned ret = func((unsigned)num); int ret_as_signed = (int)ret; int num = -6; unsigned ret = func((unsigned)num); int ret_as_signed = (int)ret; . 在 Visual Studio 中运行良好,但我想知道它的便携性如何。

有没有一种可移植的方式将无符号整数转换为有符号整数? 是否可以通过环绕来反转有符号整数转换为无符号整数的方式? 谢谢

对于有符号-> 无符号转换逆的便携式版本,如何:

if ( ret <= INT_MAX )
    ret_as_signed = ret;
else
    ret_as_signed = -(int)(UINT_MAX - ret) - 1;

您可能可以使用<limits>的模板对此进行概括。

由于 C++20 最终摆脱了 1 的补码和符号大小整数,有符号和无符号整数之间的转换是明确定义和可逆的。 所有标准整数类型现在都是 2 的补码,并且有符号和无符号之间的转换不会改变表示中的任何位。

对于 C++20 之前的 C++ 版本,原始答案仍然适用。 我将它作为历史遗迹留下。


将无符号整数转换为有符号整数,其中无符号值超出有符号类型的范围是实现定义的 您不能指望能够将负整数往返为无符号然后返回到有符号。 [1]

C++ 标准,[conv.integral],第 4.7/3 节:

如果目标类型是有符号的,如果它可以在目标类型(和位域宽度)中表示,则该值不变; 否则,该值是实现定义的。

[1] 似乎它会起作用,但不能保证。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM