原码、反码、补码 基础概念 和 计算方法 及 为什么会有反码、补码

一、原码, 反码, 补码的基础概念和计算方法.

对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式.

 

1. 原码

原码就是  符号位  加上  真值的绝对值, 即用最高位表示符号, 其余位表示值. 比如如果是8位二进制:

[+1]原 = 0000 0001

[-1]原 = 1000 0001

 

因为最高位是符号位, 所以8位二进制数的取值范围就是:

[1111 1111 ~ 0111 1111]

[-127 ~ 127]

原码是人脑最容易理解和计算的表示方式.

 

 

 

2. 反码

正数的反码是其本身

负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.

[+1] = [00000001]原 = [00000001]反

[-1] = [10000001]原 = [11111110]反

可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.

 

 

3. 补码

正数的补码就是其本身

负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

[+1] = [00000001]原 = [00000001]反 = [00000001]补

[-1] = [10000001]原 = [11111110]反 = [11111111]补

对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.

补充:负数的补码这么记忆:符号位不变,其他的从低位开始,直到遇到第一个1之前,什么都不变,遇到第一个1后保留这个1,以后按位取反。

比如:-7[原] = 10000111

         -7[补] = 11111001

 

 

4. 计算   及   为什么会有反码、补码

   有符号整数,二进制的最高位表示正负,不表示数值,最高位为0时表示正数,为1时表示负数,

   这样一来,能表示数值的就剩下(n-1)位了,

   比如 char a= -1; 那么二进制表示就为 1000 0001,

                1  表示为 00000001 ,所以除去符号位剩下的7位

                0 1111111 = 127 ,1 1111111= -127,范围应该为 -127~127 ,

   但是问题出来了,教科书上是-128~127 啊,下面就剖析一下这个惊人的奇葩。。。

 

 

 

无符号的整数  用 全部二进制位 来存储。

有符号的整数,最高位是 符号位 ,其余为表示数值。

却带来一个麻烦,当进行加法时, 1 + 1

         0000 0001

      + 0000 0001

     ———————————

        0000 0010        =   2

 

 

当 1 - 1   ( 计算机只会做加法,所以会转换为 : 1 +(-1)

         0000 0001

      + 1000 0001

    ———————————

        1000 0010        = -2        1-1 = -2  ? 明显不对

说明:用原码 做 运算是不行的。

 

解决上面的问题:发明了反码下面用 反码进行加法计算   1 + (-1)

 1  是正数,反码就是本身。

-1  是负数,反码在其原码基础上,符号位不变,其余位取反

        0000 0001

      + 1111   1110

    ——————————————————

        1111    1111       因为是反码计算,需要转换为原码: 1000 0000 = -0

说明:反码解决了相减的问题,却又带来一个问题 -0。  -0 == +0 == 0,  一个0 就够了吧。

 

为了避免这个问题,又发明了补码下面用补码进行加法计算  1 + (-1)

 1  是正数,补码就是本身。

-1  是负数,补码在其原码基础上,符号位不变,其余位取反,最后 +1

        0000 0001

      + 1111   1111

    ——————————————————

       10000 0000        这里变成了9位,char 为 8位 最高位舍弃,结果为0.  ok

 

223424_4aWh_2472425.png

223546_QVSr_2472425.png

223619_k8xj_2472425.png

223739_Kggk_2472425.png

 

 

https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html

https://wenku.baidu.com/view/4d9cfe8b7cd184254a353515.html

转载于:https://my.oschina.net/u/2472425/blog/1377665

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值