C++排雷:4. unsigned int与int之间的运算、unsigned的负数赋值

unsigned int与int类型的数据进行数值运算后,得到的结果是什么类型的呢?
通过下例检验,为unsigned型:

#include <stdio.h> 
int main()
{	
unsigned int a = 1;	
int b = -11;	
if (a + b > 0) 
printf("result is : unsigned int\n");	
else printf("result is : int\n");	
return 0;
}

如果运算符两边的运算数类型不同

  • 先要将其转换为相同的类型,即较低级类型会转换为较高级类型
  • 然后再参加运算,转换规则如下图所示:
    double ←── float 高

    long

    unsigned

    int ←── char,short 低
    参考转换规则

**那么上代码的运算结果是多少呢?**运算结果如下:

result is : unsigned int
a+b=4294967286

首先需要知道,数值在计算机中是以补码的形式存储的。

  • 同时如果两个补码相加时,最高位也就是我们的符号位如果有进位,是需要丢弃的。
  • 正数的补码是自己本身
  • 负数的补码是符号位为1,其余位为该数绝对值的原码按位取反,然后整个数再加1

因此,在整个运算中,a(1)为unsigned,b(-11)转换为了unsigned,然后进行了相加。
b具体是怎么相加的,可以参考位运算符 | & ^ ~ && ||,补码,反码

下面以一个例子解释其转换:
我们给unsigned int 类型赋值-1,对其进行输出,结果为255,为什么不是-1呢?

1.8位二进制0000 0000

2.二进制在计算机中以补码形式存在
正数的补码就是它本身
负数的补码是对应正数的原码取反加1得到

3.-1的补码是 1的原码0000 0001 取反加1就是 1111 1111

4.unsigned是无符号数,所以把会1111 1111看成正数 255 因为255的二进制为(1111 1111)

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值