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

时间:2014-03-25 00:49:19

标签: c++ standards signed

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

我有一个对无符号整数进行操作的函数,并返回一个相关的无符号整数。我通过转换为无符号类似于int num = -6; unsigned ret = func((unsigned)num); int ret_as_signed = (int)ret;来传递该函数一个有符号整数。在Visual Studio中工作正常,但我想知道它是多么便携。

是否有可移植的方法将无符号整数转换为有符号整数?它可以通过环绕转换如何将有符号整数转换为无符号整数?感谢

2 个答案:

答案 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]它似乎很有效,但没有保证。

相关问题