数据表示——原码、反码、补码、移码

本文深入探讨了计算机中数值的表示方法,包括原码、反码、补码和移码的概念及其转换过程。通过理解这些编码方式,可以更好地掌握计算机如何处理数据及提升运算效率。

    到目前为止,我们学习了十进制、二进制、八进制、十六进制等用来代表实际数值的数,称为真值,这些数我们再日常生活中都会使用到,那么在计算机中数值是怎么来表示的呢?

    数在计算机中的表示形式统称为机器数。计算机中处理数据及运算都是采用二进制,通常规定机器数用八位二进制表示。实用的数据有正数和负数,因为计算机只能表示0、1两种状态,数据的正号“+”或负号“-”,在计算机里就用一位二进制的0或1来区别,通常放在最高位,成为符号位。 符号位数值化之后,为能方便的对机器数进行算术运算、提高运算速度,计算机设计了多种符号位与数值一起编码的方法,最常用的机器数表示方法有:原码、反码、补码移码,下面就分别介绍一下它们的表示方法。
 

一、原码、反码、补码

三种表示法的转换过程如下:

 

二、移码

    因为个人移码理解有点困难,so单独解释一下:

    移码表示法是在数X上增加一个偏移量来定义的,常用来表示浮点数中的阶码,所以是整数。如果机器字长为n,规定偏移量为2^(n-1)。若X是整数,则[X]移=2^(n-1)+X


     则[+45]=+0101101+10000000,   [-45]=-0101101+10000000=0101001

实际上由此可推出,在偏移2^(n-1)的情况下,只要将补码的符号位取反便可获得相应的移码表示。

 

说明:在移码表示中,0也编码是相同的,[+0]移=1000000,[-0]移=1000000。

计算机之所以这些编码方法是为了便于运算,提高运算速度。四种表示方法其实是层层递进的,即会求十进制的二进制表示,记住符号位的正负表示,知道怎么递进的它们之间的关系。

 

 

 

### 原码反码补码移码的定义及其表示范围 #### 定义与计算方式 - **原码**是指最高位作为符号位,其余部分为数值绝对值对应的二进制形式。对于正数,其原码即为其本身的二进制表示;而对于负数,则在其前加上符号位 `1` 表示负号[^1]。 - **反码**用于区分正数和负数的表现形式。当数值为正时,反码与其原码相同;而当数值为负时,需保持符号位不变,将其余各位按位取反[^1]。 - **补码**进一步改进了对负数处理的方式。如果数值是非负整数,那么它的补码就等于自身的原码;如果是负数的话,则是在该数的反码基础上再加一得到最终结果[^1]。 - **移码**可以看作是对补码的一种调整版本,主要用于浮点数运算中的阶码表达。无论是正值还是负值情况下,都只需简单地把对应补码里的符号位置换成相反状态即可完成转换过程。 #### 各种编码的具体表示范围如下: | 编码名称 | 计算规则 | 数值范围 | |----------|--------------------------------------------------------------------------------------------|-------------------| | 原码 | 首位代表符号(0表正,1表负),后续七位存储实际大小 | -127 ≤ N ≤ 127 | | 反码 | 正数同原码;负数除保留第一位外其他所有比特均反转 | -127 ≤ N ≤ 127 | | 补码 | 正数依旧采用原始模式呈现出来;针对那些小于零的数据项来说则是先求得它们各自的反码之后再加上单位量形成新的表现形态 | -128 ≤ N ≤ 127 | | 移码 | 将任何类型的输入参数按照既定规律转变为具有特定偏置特性的新序列 | -128 ≤ N ≤ 127 | ```python def get_twos_complement(num_bits, value): if value >= 0: return bin(value)[2:].zfill(num_bits) else: inverted = ''.join(['1' if b == '0' else '0' for b in format(abs(value), f'0{num_bits}b')]) complemented = int(inverted, 2) + 1 return bin(complemented)[-num_bits:] print(get_twos_complement(8,-5)) # 输出:11111011 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值