无符号数相减问题 C语言

int main()
{
    unsigned int a=50;
    unsigned int b=100;
    printf("%u",a-b);
    return 0;
}

结果是4294967246

为什么呢?

实际上  CPU里只有加法器  没有减法器   做a-b运算时,实际上是做了a+(~b)+1

因为计算机运算采用补码运算

a-b=a[补码]+(-b)[补码]

50的二进制是:                00000000|00000000|00000000|00110010
100的二进制是:            00000000|00000000|00000000|01100100

50的补码是                      00000000|00000000|00000000|00110010

-100的补码是                    11111111|11111111|11111111|10011100

补码相加得到的结果是           11111111|11111111|11111111|11001110=4294967246

由于a-b得到的是无符号整形,所以原码与补码相等  结果自然为4294967246



你可能感兴趣的:(C语言,补码,无符号整形)