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

转载于:https://www.cnblogs.com/YURiCA/p/10994255.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值