c++中无符号整数回绕机制以及原理解析

c++中无符号整数回绕机制以及原理解析

最近在重温c++primer,顺便训练自己写博客的能力,想着马上毕业了,找工作方面一直在java和c++之间犹豫,后来思来想去,还是觉得不管怎么说,c++毕竟是造轮子的语言,那就好好钻研~

1.关于无符号整数回绕机制

#include <iostream>
using namespace std;

int main()
{
  // cout << "Hello World"<<endl;
   unsigned a1 = 10,a2 = 20;
	cout<<"a1-a2="<<a1-a2<<endl;  // a1-a2=4294967286
	cout<<"a2-a1="<<a2-a1<<endl; // a2-a1=10
	
	cout<<"unsigned -1  =  "<<unsigned(-1)<<endl;// unsigned -1  =  4294967295

   return 0;
}

这问题说简单也简单,说恶心也是的,如果出现在for循环中,那无限循环有可能问题都找不到在哪里

先看最后一行代码,-1(int类型)转换成unsigned类型是4294967295,这个奇奇怪怪的书事实上是2的32次方减1,因为int类型是32位的,同样的 a1-a2 = 4294967286是2的32次方减10.

什么原因造成的呢?这要从计算机的编码方式说起:原码,反码,补码。

2.原码,反码,补码

首先明确一点,在计算机内部,所有的带符号数据都是用补码表示的,那究竟为什么用补码表示呢?

我们知道:原码的表示方法:最高位作为符号位,不表示数据,0为正,1为负。
比如 [+1] = [0000 0001] (原码) [-1] = [1000 0001] (原码)

反码:正数和原码相同,负数:符号位不变,其余数位取反
[+1] = [0000 0001] (反码) [-1] = [1111 1110] (反码)

补码:正数和原码相同,负数:符号位不变,其余数位取反+1
[+1] = [0000 0001] (补码) [-1] = [1111 1111] (补码)

所以到这里,基本出来了,-1对于带符号型(以8位为例)来说用补码表示自然就是 1111 1111
对于不带符号整数来说,最高位不表示符号位,故表示255 这也是unsigned回绕机制的原理。说到底,还是计算机底层表示

有关为什么要用补码,以及补码相关的论证,参考这位大佬的博客,写的好棒。传送门

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值