C++ 存储在无符号整数中的负值

C++ 存储在无符号整数中的负值,c++,bit-manipulation,bit,bit-shift,C++,Bit Manipulation,Bit,Bit Shift,我们知道如果我们想在32位有符号整数中存储num=-1,它的位表示形式如下 1000 0000 0001 但是如果我喜欢这个num=-1 unsigned int num1=num则num1位表示形式将类似于1111111111111111111111111111111111111 我们还知道,在无符号整数中,msb不表示符号,它对大小有影响,我想知道为什么num1表示中都有,我如何预测无符号整数中-2的值 注意,我正在用cpp语言尝试所有操作 #include<bits/stdc++.h

我们知道如果我们想在32位有符号整数中存储
num=-1
,它的位表示形式如下
1000 0000 0001

但是如果我喜欢这个
num=-1
unsigned int num1=num
则num1位表示形式将类似于
1111111111111111111111111111111111111

我们还知道,在无符号整数中,msb不表示符号,它对大小有影响,我想知道为什么num1表示中都有,我如何预测无符号整数中-2的值

注意,我正在用cpp语言尝试所有操作

#include<bits/stdc++.h>
using namespace std;
int main(){
    unsigned int num = -1;
    ///i want to know what will be the bit representation of num=-2
    while(num){
        cout<<(num&1);
        num>>=1;
    }

}
#包括
使用名称空间std;
int main(){
无符号整数num=-1;
///我想知道num=-2的位表示形式是什么
while(num){
cout=1;
}
}

正如您所说,与所有其他位一样,无符号整数的MSB也会影响大小。您可以看到,因为
unsigned int num1=-1
给出了
1111111111111111111111111111111
,这是可能的最大无符号值(2^32)-2实际上是
num1-1
。因此,只需减去1,即可得到
1111111111111111111111111111111110
(2^32-1)


当您将负数赋给unsigned int时,如您所说,负数的第一位是符号位,另一位是数字的二进制,例如二进制表示法-2是1000 0000 0000 0010 unsigned int,获取该数字的两个完整数字。如果要将有符号二进制转换为两个完整数字从右起的第一个1开始,除有符号位外,每个位都得到,因此-2的两个完整值应为1111111111111111111111111111111111111111110。

关于第一句话,也许您应该尝试检查系统上的表示它们都存储为所有1。谷歌“2的补码”,但假设在8位中,我们将1表示为0000 0001,为了得到-1,我们将首先进行1s补码1111110,然后进行两个补码1111111111不,几乎所有现代系统都不是这样工作的-1为1。建议读数:和。