(5)原码反码补码

# (1)概念  

计算机的所有数据在底层都是以二进制的[补码]形式存储

实际人们看到的数字是[原码]转化来的

而[原码]是通过[补码]得到的

补码 -> 原码 -> 最后人们看到的数

***进制转换的时候需要先把内存存储的补码拿出来变成原码在进行转换输出***​

正数高位补0 负数高位补1(前面空白位全是1)

数字1   00000000 1 正数高位都补0

数字-1 111111111 1 负数高位都补1

原码: 用来转换对应进制

反码: 二进制码0变1,1变0叫做反码,反码用于原码补码之间的转换.(符号位不变)

补码: 用来做数据的存储运算. 补码提出的根源是让计算机底层的实现减法操作(可以表达出一个数的正负)

言外之意:计算机默认只会做加法,例:5+(-3) => 5 - 3

乘法除法:是通过左移和右移 << >> 来实现

# (2)运算

(原码 反码 补码之间的转换 , 符号位不要动)

正数: 原码 = 反码 = 补码

负数: 原码 = 补码取反加1   给补码求原码

负数: 补码 = 原码取反加1   给原码求补码

例:计算-9+5的结果,先分别算处二进制

-9

000000001001 (原码)==>负数的原码前面都是0补位

1111111110110 (反码)==>原码全部取反

1111111110111 (补码)==>反码+1,如果都是1就进一位

5

0000000000101 (正数==>原码 = 反码 = 补码)

 

1111111110111 -9的补码

000000000101 5的补码

1111111111100 (补码)====>两者补码相加得到新的补码

补码==>取反 + 1 ==> 原码

000000000011 (取反)

000000000100 (加1==> 原码)得到 -4

只保留符号位第一位,剩下中间的位用0填充即可

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/lyj910313/p/10795615.html

### 原码反码补码的转换规则 #### 1. **原码反码之间的转换** - 对于正数,其原码反码相同。 - 对于负数,反码可以通过将原码中的符号位保持不变,其他位按位取反来获得。 示例: - 数值 `-5` 的原码为 `10000101`(假设字长为8位),则其反码为 `11111010`[^3]。 --- #### 2. **原码补码之间的转换** - 对于正数,其原码补码相同。 - 对于负数,补码可通过先得该数的反码,然后在其基础上加 1 来获取。 示例: - 继续以上述 `-5` 为例,已知其反码为 `11111010`,那么它的补码为 `11111011`[^1]。 --- #### 3. **反码补码之间的转换** - 对于正数,其反码补码相同。 - 对于负数,补码等于反码加 1;反之,通过将补码减去 1 即可恢复成反码。 示例: - 已知某负数的补码为 `11111011`,将其减去 1 后得到反码 `11111010`[^2]。 --- #### C语言实现代码 以下是基于上述理论编写的用于完成各种编码之间相互转换的功能函数: ```c #include <stdio.h> // 将原码转为补码 int toTwosComplement(int num) { if (num >= 0) { return num; // 正数原码补码相同 } return (~(-num) + 1); // 负数原码补码 } // 将补码还原为原码 int fromTwosComplement(int num) { if ((num & 0x8000) == 0) { return num; // 补码为正数时不变 } return -(~(num - 1)); // 补码为负数时转原码 } // 反码补码 int onesToTwosComplement(int num) { if ((num & 0x8000) == 0) { return num; // 正数反码补码相同 } return num + 1; // 负数反码补码 } // 补码反码 int twosToOnesComplement(int num) { if ((num & 0x8000) == 0) { return num; // 正数补码反码相同 } return num - 1; // 负数补码反码 } ``` --- ### 总结 通过对不同编码形式的理解及其相互关系的学习可知,采用补码表示法能够有效解决传统原码在执行加减运算过程中遇到的一些特殊问题,比如存在两个零的情况以及无法正确处理某些边界条件等问题。因此,在现代计算机体系结构设计中广泛采用了这种机制以提高数据处理效率并减少错误发生几率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值