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. 赋值表达式中,右边表达式的值隐式转化为左边的值

posted @ 2019-06-09 18:10  YURiCAhana  阅读(4570)  评论(0编辑  收藏  举报