我知道在C中,无符号整数到有符号整数的转换是实现定义的,但C ++的含义是什么?我想有人会问过这个问题,我搜索过但我找不到它。
我有一个对无符号整数进行操作的函数,并返回一个相关的无符号整数。我通过转换为无符号类似于int num = -6; unsigned ret = func((unsigned)num); int ret_as_signed = (int)ret;
来传递该函数一个有符号整数。在Visual Studio中工作正常,但我想知道它是多么便携。
是否有可移植的方法将无符号整数转换为有符号整数?它可以通过环绕转换如何将有符号整数转换为无符号整数?感谢
答案 0 :(得分:2)
对于signed->无符号转换的逆的可移植版本,如何:
if ( ret <= INT_MAX )
ret_as_signed = ret;
else
ret_as_signed = -(int)(UINT_MAX - ret) - 1;
您可以使用<limits>
中的模板来概括这一点。
答案 1 :(得分:1)
无符号整数转换为有符号整数,其中无符号值超出有符号类型的范围是实现定义。你不能指望能够将负整数往返到无符号然后再回到签名。 [1]
C ++标准,[conv.integral],§4.7/ 3:
如果目标类型已签名,则该值如果可以在目标类型(和位字段宽度)中表示,则不会更改;否则,该值是实现定义的。
[1]它似乎很有效,但没有保证。