C语言中unsigned int加减的问题
unsigned int a=10; unsigned int b=20;
此时按照一般想法,a-b应该等于-10,但是当打印出来发现,结果却是4294967286
这时问题出在unsigned int上。
在我的机器上,unsigned int是32位的。
我们都知道,在计算机中,数字是按补码存储在存储器中,而且使用补码进行加减乘除等各种运算,unsigned int可以解释为正数
a的补码为:00000000000000000000000000001010
b的补码为:00000000000000000000000000010100
两个数相减,在硬件中是[x]补+[-y]补 我们知道[-y]补为y的补码每一位取反加以
所以-b的补码为:11111111111111111111111111101100
运算的结果是11111111111111111111111111110110,正数的补码和原码相同,所以对应的十进制数为4294967286
但是当两个a b的数据类型为有符号整数时
int a=10; int b=20;
还是进行上述操作,得到11111111111111111111111111110110,但是这个数是结果的补码,而该数是有符号数,因为最高位为1,所以按照负数的补码到原码的计算方法,符号位不变,其他位取反加1
所以计算结果的原码是10000000000000000000000000001010,所以此时计算的结果为-10。
当一个数为unsigned int另一个为int时
unsigned int a = 10; int b = 20; cout <<"a-b="<< a-b << endl;
此时打印出来的结果为a-b=4294967286。
但是当上述代码进行如下修改
unsigned int a = 10; int b = 20, sum = 0; sum = a - b; cout <<"a-b="<< sum << endl;
此时打印出来的结果为a-b=-10
隐式类型转换
1. 算数运算式中,低类型被隐式的转化为高类型
2. 赋值表达式中,右边表达式的值隐式转化为左边的值