原码、反码、补码的转换

本文介绍了二进制有符号数的三种表示方式——原码、反码和补码,强调了最高位作为符号位的规则。详细解释了正数和负数在三种码制下的转换,并通过实例展示了补码在数值运算中的作用,特别是如何通过补码实现加减法的统一处理。此外,还通过代码测试验证了补码在内存中的存储方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数字在机器中都用二进制来进行存储,有符号数则有原码、反码和补码三种表示方式
这三种表示方式里,最高位都代表的是符号位,1代表负数,0代表正数

1.原码

一个数的原码就是该数直接转化成二进制得到的数字,第一位是符号位

+8的原码:0000 1000
-8的原码:1000 1000

2.反码

正数的反码是自己本身

+8的原码:0000 1000
+8的反码:0000 1000

负数反码就是原码除了符号位不动,其他所有位按位取反

-8的原码:1000 1000
-8的反码:1111 0111

3.补码

正数的补码是自己本身

+8的原码:0000 1000
+8的反码:0000 1000
+8的补码:0000 1000

负数的补码是反码加一得到的(运算时包括符号位)

-8的原码:1000 1000
-8的反码:1111 0111
-8的补码:1111 1000

正数的原反补码都是相等的,负数的原反补码是相互转换得到的

4.补码存在的意义

在机器中,数值一律用补码来表示和存储。

使用补码的原因:

  1. 使用补码可以将符号位和数值域统一处理
  2. 两个数字之间进行加减法运算时是将数字拿到CPU中进行计算的,而CPU只有加法器,要将减法转换成加法,所以可以利用补码使加减法统一操作

举个例子

计算 8 - 5
因为CPU只有加法器所以要将 8 - 5 转换成 8 + (- 5) 来计算
(+8)
8的原码:0000 1000
8的反码:0000 1000
8的补码:0000 1000
(-5)
-5的原码:1000 0101
-5的反码:1111 1010
-5的补码:1111 1011
8 - 5 = 8+(-5)
 0000 1000
+1111 1011
-----------------
  0000 0011
0000 0011的符号位是0,则表示正数,原反补码都相同,转化成十进制就是3

代码测试

int main()
{
	int i = 8;
	int j = -5;
	int m = i + j;
	printf("%d\n", m);
	return 0;
}

结果得到
在这里插入图片描述

我们利用调试看一下内存中存放的数据
首先查看 i 的地址里存放的数据
在这里插入图片描述
看到他在内存中存的是 08(这里是16进制)转换成二进制就是 0000 1000( 8 的补码)

之后我们看一下 j 的地址里存放的数据

这里存的是 fb 转化成二进制就是 1111 1011(这里就是 -5 的补码)

所以数据在机器中以补码形式表示和储存,补码的出现也更加便于计算

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值