7.负数转换无符号unsigned

//2019/03/04
#include <iostream>

int main() {
    unsigned u1 = 42, u2 = 10;
    std::cout << u1 - u2 << std::endl;
    std::cout << u2 - u1 << std::endl;
    system("pause");
    return 0;
}

结果:

 

4294967295 ??

 

首先,仔细观察输出的结果4294967295,发现4294967295=2^32-1,哦!好像有点规律!

但是,又为啥会是这样?

让我们先来讨论下int和unsigned int的表现形式,他俩都是4个字节,32位的二进制表示,但int有一位是符号位,unsigned则没有。

-1的int类型表示为1000 0000 0000 0000 0000 0000 0000 0001,

那么将其强制转换成unsigned int 应该是1000 0000 0000 0000 0000 0000 0000 0001(红色为符号位),用指数表示是2^31+1,而不是2^32-1!

 

由于计算机存储的是补码,补码=除符号位,原码取反+1,

即:-1:1000 0000 0000 0000 0000 0000 0000 0001

 取反:  1111 1111 1111 1111 1111 1111 1111 1110

  加1:1111 1111 1111 1111 1111 1111 1111 1111 = 2^32-1

转载于:https://www.cnblogs.com/foremember/p/10472515.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值