8位二进制数的原码、反码、补码以及它能表示的范围

本文详细解析了正负数在计算机中的补码表示法,特别关注了负零的特殊情况和八位二进制如何表示-128到+127的整数范围,以及补码运算与减法的关系。
=====================================================================================
1、正数的反码和补码都与原码相同。 
2、而负数的反码为对该数的原码除符号位外各位取反。 
3、负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1

1、原码表示法规定:用符号位和数值表示带符号数,正数的符号位用“0”表示,负数的符号位用“1”表示,数值部分用  二进制形式表示。 
2、反码表示法规定:正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。 
3、补码表示法规定:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1. 
4、正零和负零的补码相同,[+0]补=[-0]补=0000 0000B。

计算机中数值都是以补码的形式存储
======================================================================================
    真值             原码       ||       反码               补码              表示的数值
======================================================================================
    0             0000_0000   |                       0000_0000                  0
    1             0000_0001   |                       0000_0001                  1
   ...               ....     |                         ....
   ...               ....     |                         ....
   ...               ....     |                         ....
   ...               ....     |                         ....
   ...               ....     |                         ....
   127            0111_1111   |                       0111_1111                 127
=====================================================================================
   -0             1000_0000   |    1111_1111          1_0000_0000              -128  
   -1             1000_0001   |    1111_1110           1111_1111               -127
   -2             1000_0010   |    1111_1101           1111_1110               -126
  ...                ....     |
  ...                ....     |
  ...                ....     |
  -127            1111_1111   |    1000_0000           1000_0001                 -1
===================================================================================== 
  
=====================================================================================
    符号位         数值位
   1(负数)           7位 
   0(正数)           7位

   特殊:10000000  :-0表示-128
   上述的-0位特殊情况,规定它在计算机中的表示的数为-128;
   -0:10000000按位取反再加1后为1_0000_0000超出了8位,把这个值规定为8位表示的-128;
   因此8位二进制数可表示的有符号数为0-255;可表示的无符号数为-128-0-127
=====================================================================================
在这里要说到一个概念 模,“模”是指一个计量系统的计数范围。如时钟等。 
时钟的计量范围是0~11,模=12。表示n位的二进制数计量范围是0~2(n)-1,模=2(n),
八位二进制数的模为2^8 。
任何有模的计量器,均可化减法为加法运算(这就是计算机二进制运算的原理)。假设当前
时针指向10点,而准确时间是6点,调整时间可有以下两种拨法:一种是倒拨4小时,即:
10-4=6;另一种是顺拨8小时:10+8=12+6=6 。在以12模的系统中,加8和减4效果是一样
的,因此凡是减4运算,都可以用加8来代替。对“模”而言,8和4互为补数。实际上以12模的
系统中,11和1,10和2,9和3,7和5,6和6都有这个特性。共同的特点是两者相加等于模。
对于计算机,其概念和方法完全一样。n位计算机,设n=8, 所能表示的最大数是11111111,
若再加1成为100000000(9位),但因只有8位,最高位1自然丢失。又回了00000000,
所以8位二进制系统的模为2^8。在这样的系统中减法问题也可以化成加法问题,只需把减
数用相应的补数表示就可以了,把补数用到计算机对数的处理上,就是补码。
对一个正数的原码取反加一,得到这个正数对应负数的补码。例如~6=-7,而且加一之后
会多出一个八进制补码1000 0000,而这个补码就对应着原码1000 0000,数字位同时当做符号位即-128 。
所以根据以上我们可以理解为什么八位二进制数表示范围为-128~+127。
八位二进制正数的补码范围是0000 0000 ~ 0111 1111 即0 ~ 127,负数的补码范围是正数
的原码0000 0000 ~ 0111 1111 取反加一(也可以理解为负数1000 0000 ~ 1111 1111化为
反码末尾再加一)。  所以得到 1 0000 0000 ~ 1000 0001,1000 0001作为补码,其原码
是1111 1111(-127),依次往前推,可得到-1的补码为1111 1111,那么补码0000 0000
的原码是1000 0000符号位同时也可以看做数字位即表示-128,这也解释了为什么
127(0111 1111)+1(0000 0001)=-128(1000 0000)。

### 原码反码补码和移码的定义及其表示范围 #### 定义与计算方式 - **原码**是指最高作为符号,其余部分为数值绝对值对应的二进制形式。对于正数,其原码即为其本身的二进制表示;而对于负数,则在其前加上符号 `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 ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值