[英]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.