2.8 c++ 原码、反码、补码

2.8 原码、反码、补码

2.8.1 原码、反码、补码的概述

计算机存储的是数据的补码。

原码:计算机中对数据的二进制定点表示方法

123:原码0111 1011

无符号数:

​ 补码==反码==原码

​ 123原码:0111 1011

​ 123反码:0111 1011

​ 123补码:0111 1011

有符号数:

​ 正数:

​ 补码==反码==原码

​ +123原码:0111 1011

​ +123反码:0111 1011

​ +123补码:0111 1011

​ 负数:

​ 反码==原码符号位不变,其他位按位取反。

​ 补码==反码+1

​ -123原码:1111 1011

​ -123反码:1000 0100

​ -123补码:1000 0101

负数在计算机以补码的方式存储

非负数在计算机以原码的方式存储

2.8.2 补码的意义

1、统一了0的编码
+0的补码:0000 0000
-0的补码:0000 0000
2、将减法运算变加法运算

假如:没有补码10-6

10:		0000 1010
-6:		1000 0110
------------------------
		 1001 0000----->-16结果有问题

有补码 10-6

10:		0000 1010
-6:		1111 1010
-------------------------
		 0000 0100---->4

2.8.3 对数据的存

负数在计算机以补码的方式存储

非负数在计算机以原码的方式存储

八进制数 以原码存储

十六进制 以原码存储

以十六进制查看内存数据存储情况

short data1 = -10;//补码存储
cout<<bitset<16>(data1)<<endl;//1111 1111 1111 0110
short data2 = 6;//原码存储
cout<<bitset<16>(data2)<<endl;//0000 0000 0000 0110
short data3 = 0x8080;//原码存储
cout<<bitset<16>(data3)<<endl;//1000 0000 1000 0000

2.8.4 对数据的取

如果是对 无符号变量 进行取值,输出内存的原样数据。

//先将-10转成无符合数(-10的补码)
unsigned short data = -10;//源码1000 0000 0000 1010 补码1111 1111 1111 0110
cout<<bitset<16>(data)<<endl;//1111 1111 1111 0110
cout<<"data="<<data<<endl;//65526==1111 1111 1111 0110

如果是对 有符号变量 进行取值,系统会去看内存的最高位,如果最高位为0 表明正数,内存原样输出。

short data = 10;//原码0000 0000 0000 1010
cout<<bitset<16>(data)<<endl;//0000 0000 0000 1010
cout<<"data="<<data<<endl;//10

系统会去看内存的最高位,如果最高位为1表明负数,将内存数据求补码(得到原码)输出

short data=0x8080;//1000 0000 1000 0000
cout<<bitset<16>(data)<<endl;//1000 0000 1000 0000
cout<<"data="<<data<<endl;//-32640 = 1111 1111 1000 0000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值