2014-03-25 41 views
0

我知道在C中,无符号到有符号整数的转换是实现定义的,但它对于C++来说又是什么?我想有人会问这已经,我搜查,但我找不到它。C++将无符号转换为带符号整数的可移植性

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

是否有一种便携的方式将无符号整数转换为带符号整数?有可能只是将有符号整数转换为无符号整数?谢谢

+0

[可移植性如何将-1转换为无符号类型?](http://stackoverflow.com/questions/1667963/how-portable-is-casting-1-to-an- unsigned-type) – jterrace

+1

@jterrace不同意。这是signed到unsigned的转换,我知道它是环绕的。我想知道的是无符号转换为signed。 – loop

+0

@test你不关心'-6'转换为'unsigned int'吗? –

回答

1

将无符号整数转换为无符号值超出带符号类型范围的有符号整数是实现定义的。你不能指望能够将一个负数整数无符号地返回到signed。 [1]

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

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

[1]它似乎有效,但没有保证。

2

对于人签署>无符号转换的逆的便携版,怎么样:

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

你可以使用模板<limits>大概概括这一点。

+0

这也是一个很好的答案。我问了一个两部分问题,rici回答了一部分,而你回答了另一部分问题。不幸的是,没有办法将两者都标记为正确。 – loop

相关问题