如何理解计算机组成中——真值,原码,补码,反码,移码之间的关系

关于原码、反码、补码和移码的定义如下

1:原码:

 

 

 2:补码

 

 

 3:反码

 

 

 4:移码

 

 

上述公式很复杂,因此,可以总结出一些常见的规律:

原码

如果机器字长为n,那么一个数的原码就是用一个n位的二进制数,其中最高位为符号位:正数为0,负数为1。剩下的n-1位表示概数的绝对值。
 
例如: X=+ 101011 , [X]原= 0, 0 101011    X=- 101011 , [X]原= 1,0 101011 
位数不够的用0补全。

 反码

知道了什么是原码,反码就是在原码的基础上,符号位不变其他位按位取反(就是0变1,1变0)就可以了。

 例如:X=-101011 , [X]原= 1,0101011 ,[X]反=1,1010100

补码

在反码的基础上按照正常的加法运算加1。

或者原码除符号位外每位取反末位加

 例如:X=-101011 , [X]原= 10101011 ,[X]反=11010100,[X]补=11010101

 移码

移码最简单了,不管正负数,只要将其补码的符号位取反即可。

例如:X=-101011 , [X]原= 10101011 ,[X]反=11010100,[X]补=11010101,[X]移=01010101

转载于:https://www.cnblogs.com/xiaxj/p/7118408.html

### 计算机组成原理学习笔记 #### 原码补码反码移码的概念及其相互转换 在计算机科学中,为了有效地处理正负数并简化硬件设计,引入了几种不同的编码方式来表示二进制数据。 - **原码 (Sign-Magnitude Representation)** 是最直观的一种形式,在这种模式下最高位作为符号位用来区分正负;其余各位则直接对应绝对值的二进制表达。对于八位机器而言,+7会被记作`0000 0111`而−7则是`1000 0111`[^1]。 - **反码 (One's Complement)** 的定义是在已知某个数X的原码基础上得到其相反数Y的方法之一:当X为正时保持不变;如果X是负数,则除了首位外其他所有位置上的比特都要翻转(即由0变1或反之)。例如十进制整数-14使用反码表示就是 `1111 0001`。 - **补码 (Two's Complement)** 提供了一种更加高效的解决方案用于加减运算操作。它基于这样的原则——任何给定字长n内的有符号整数Z都可以通过将其对应的无符号数值加上\(2^{(n)}\) 来获得。具体来说,求得一个数N的补码可以先计算它的反码再对该结果整体加一。因此,-14采用8-bit存储格式下的补码应写作`1111 0010`。 - **移码 (Bias Representation)** 主要应用于浮点数规格化过程中指数部分的表现上。简单理解的话,就是在原有真值的基础上增加了一个固定的偏置量bias从而使得所有的可能取值都变为正值范围之内便于比较大小关系。比如IEEE标准规定单精度float类型的E字段实际意义等于e+bias其中bias=127;双精度double里边相应地设定了另一个更大的常数1023作为偏置因子。 ```python def get_complements(value, bits): """获取指定长度bit位的原码/反码/补码""" if value >= 0: original_code = bin(value)[2:].zfill(bits) one_complement = ''.join(['1' if b=='0' else '0' for b in original_code]) two_complement_int = int(one_complement, 2) + 1 two_complement_bin = bin(two_complement_int)[2:].zfill(bits)[-bits:] return { "original": f"0{original_code}", "one_comp": f"{''.join('1' if c == '0' else '0' for c in ('0'+original_code))}", "two_comp": f"{two_complement_bin}" } else: abs_val = abs(value) original_code = bin(abs_val)[2:].zfill(bits) one_complement = ''.join(['1' if b=='0' else '0' for b in original_code]) two_complement_int = int(one_complement, 2) + 1 two_complement_bin = bin(two_complement_int)[2:].zfill(bits)[-bits:] return { "original": f"1{original_code}", "one_comp": f"1{''.join('1' if c == '0' else '0' for c in original_code)}", "two_comp": f"{'{:0%db}' % bits.format(int(not bool(value<0))*int(original_code,2)+(value<0)*two_complement_int)}" } print(get_complements(-14, 8)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值