2017-09-01 23 views
-6

在下面的代码给出输出-1否定位

#include <iostream> 
using namespace std; 
int main() 
{ 
    int x=0; 
    cout<<~x; 
    return 0; 
} 

但是,当我做如下修改答案更改4294967295。 只是想知道,为什么在INT它是不是给-2147483647这是111 .... 32倍

#include <iostream> 
using namespace std; 
int main() { 
    unsigned int x=0; 
    cout<<~x; 
    return 0; 
} 
+7

也许你需要了解[补](https://en.wikipedia.org/wiki/Two's_complement) ? –

+1

你期望什么? 'unsigned'不能包含负数,所以'all bits 1'将会是一个很大的数字,而'signed'则不会(提示:符号位,二进制补码)。你的具体问题是什么? –

+0

只是想知道,为什么在INT它是不是给-2147483647这是111 .... 32倍的情况下 –

回答

2

情况下,~操作反转所有位的操作数。在这里,x开始为0,所以假设的int是4个字节宽它具有以下二进制表示:

00000000 00000000 00000000 00000000 

当所有位被倒置你:

11111111 11111111 11111111 11111111 

假设的二进制补码表示整数,这个比特序列的值是-1。请注意,如果您将此值加1,则所有位变为0(即-1 + 1 = 0)。

相比之下,-2147483647值有如下表示:

10000000 00000000 00000000 00000001