【计组】【原码反码补码】【整数篇】每隔一段时间都容易忘记的点,在这提醒一下自己

①原码:

(1)最高位作为符号位(0正,1负),其他位是数值位;

eg:

        1)1001:表示  -1

        2)0001:表示 +1

②反码:

(1)对于正数:

         同正数原码。

(2)对于负数:

        符号位不变,其余数值位取反。

③补码:

(1)对于正数:

         同正数原码。

(2)对于负数:

         在反码的基础上+1。

④移码:

(1)不论正负,都是仅对对应补码的符号位取反(注意,此处前提是偏移量为2^{7},即128

(2)真正的移码的定义是:移码=真值+偏移量

(3)这里的偏移量一般取2^{n-1},其中,n为机器字长,-1代表不考虑符号位。如下方的               8bit位,即n-8,偏移量就取2^{7}

        eg:

  • 127(补码:0111 1111),移码=127+2^{7}=255(移码:1111 1111)
  • -127(补码:1000 0001),移码=-127+2^{7}=1  (移码:0000 0001)
  • -128(补码:1000 0000),移码=-128+2^{7}=0  (移码:0000 0000)
  • 而对于128而言,规定bit位为8时,其原码、反码、补码、移码都不存在。

(4)在IEEE754标准下,由于规格化的标准(保证个位为1)和普通浮点数的规格化标准(保证小数点后一位为1(正数)或0(负数))不同,所以最后偏移量实际为2^{n}-1,偏移量用于移动阶码,同时IEEE754标准下阶码是用移码表示,没有符号位,或者认为原本的符号位被作为了数值位(因为移码最小的表示为全0,最大的表示为全1),所以此时偏移量应该取2^{n},减一是由于规格化标准不同,一个保证个位,一个保证小数点后一位,所以要-1,代表比起普通规格化而言,左移了一位,尾数左移一位,则阶码少×一个2。


其他问题

①范围问题:(以下统一用8bit位举例)

(1)原码:(-127  ~  +127)

  • 1)正数

        0000 0000(0)~   0111 1111(+127)

  • 2)负数

        1111 1111(-127)~  1000 0000(0)

  • 3)0

        可以用两种方式表达:1000 0000 和 0000 0000

(2)反码:(-127  ~  +127)

  • 1)正数

        同原码。

        0000 0000(0)~   0111 1111(+127)

  • 2)负数

        1000 0000(-127)~  1111 1111(0)  

  • 3)0

        可以用两种方式表达:1111 1111 和 0000 0000

(3)补码:(-128  ~  +127)

  •  1)正数

        同原码。

        0000 0000(0)~   0111 1111(+127)

  • 2)负数

        1000 0000(-128)~  0000 0000(0)

  • 3)0

        仅能用一种方式表达:0000 0000          

(4)移码:(-128  ~  +127)

  • 1)由于不论正负,移码只是对所求数的补码的符号位取反,所以此时也不论正负。

        0000 0000(-128)~  1111 1111(+127)

        当然,此处的前提是偏移量取128,即2^{7}


②关于补码的几个疑问:

  1. 按理来说负数补码应该为:1000 0001(-127)~  1 0000 0000(0),但是,这样有两个问题,一个是1000 0000未被使用,一个是出现9bit位的数字;
  2. 这里实际上反码1111 1111最低位再+1,应该是1 0000 0000,由于规定了8bit位的长度,所以认为这个最高位的1溢出,结果是0000 0000
  3. 所以在补码中,认为0的表示唯一,即0000 0000而未被使用的1000 0000,则认为是-128。

③1000 0000表示-128而不是128的问题

那么有人可能会问为什么这个1000 0000表示-128,而不是正数的128?以下给出解释:

  1. 由于最高位为1,所以再规定8bit位时,1000 0000被划分为负数这边,所以认为是-128。
  2. 由于1000 0000现在的讨论范围是补码,对于-1和255而已,二者对256的mod运算,结果相等。对于255而言,正数的补码就是他的原码本身,即1111 1111。那么对于-1,原码1000 0001对应的补码也是1111 1111;同理,-128和128的补码也是一样的,也即当正数表示的值为0~127时,所有负数(-128~-1)等价的范围是(128~255);加上为了符号位的1表示负数,所以规定1000 0000为-128而不是128。

④作用问题:

那么有人可能会问这些码是干什么用的呢?以下给出解释:        

  1. 原码,是最简单的整数表示方法,直接使用二进制表示数值,并用最高位表示符号位(0表示正数,1表示负数)。优点是直观,容易理解。但是,原码的缺点是加法和减法运算复杂,需要额外的规则来处理符号位。
  2. 反码, 为了解决原码在加减运算中的问题。优点是加减法运算规则简单,只需对应位相加并进位。但是,反码的缺点是存在两个零值:正零和负零。
  3. 补码,为了解决反码的正零和负零问题。补码的优点是只有一个零值,可以直接进行加减运算,而不需要额外的规则。而且补码可以通过减法运算实现加法,从而简化了计算机的逻辑电路设计。
  4. 移码,移码的主要用途是在浮点数的指数表示中,其中移码被用作偏移值。移码的具体形式取决于使用的具体标准和应用场景。例如,在IEEE 754标准中,32位单精度浮点数的指数部分采用8位移码表示。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值