2015-10-26 16 views
3

下面是从C++总理第五什么时候int值通常转换为无符号?

如果我们使用两个无符号和在算术表达式诠释值,int值通常被转换成无符号的。

我试图以下代码:

int i = -40; 
unsigned u = 42; 
unsigned i2 = i; 
std::cout << i2 << std::endl; // 4294967256 
std::cout << i + u << std::endl; // 2 

对于i + u,如果i转换为unsigned,应当4294967256,然后i + u不能等于2

是否int如果我们在算术表达式中同时使用unsignedint值,总是将值转换为unsigned

+1

我为什么不能1 + u'不等于2? –

+1

根据规则,表达式'i + u','i'被转换为'4294967256'。 – chenzhongpu

+2

您的问题可能有点偏离。更明显的问题可能是*“为什么 - 如果这个规则真的被应用了,我还能得到答案'2'吗?”* –

回答

5

是的。

你遇到的是整数溢出。负数的符号由前导符号位给出,其为0(正数)或1(负数)。然而,对于无符号整数,这个首位只会给你多一点的整数精度,而不是符号的指示。 “负”有符号数字最终从最大无符号整数大小向后计数。

这与您的特定代码有什么关系?那么,-40确实变成了4294967256.然而,4294967256 + 42不能适合一个无符号整数,就好像你记得-40只是变成了最大无符号整数减去39.所以通过加42,你超过了容量你的数据类型。可能的第33位只是被切断,而你从0开始。因此,你仍然得到2作为答案。

Signed:    -42,  -41, ...,   -1, 0, 1, 2 
Unsigned: 4294967256, 4294967257, ..., 4294967295, 0, 1, 2, ... 
                ^--^ Overflow! 

你可能会有兴趣在阅读Two's Complement

相关问题