int main()
{
unsigned int a=50;
unsigned int b=100;
printf("%u",a-b);
return 0;
}
结果是4294967246
为什么呢?
实际上 CPU里只有加法器 没有减法器 做a-b运算时,实际上是做了a+(~b)
因为计算机运算采用补码运算
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