欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

原码补码与反码

发布时间:2023/12/3 编程问答 46 豆豆
生活随笔 收集整理的这篇文章主要介绍了 原码补码与反码 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

【README】

1.本文内容总结自“哈工大刘宏伟”老师的mooc视频《计算机组成原理》on bilibili;

2.为了便于理解,本文引入了逗号分割符号部分和数值部分,计算机存储数据的时候没有逗号;


【1】原码表示法

原码定义: 原码是真值保存在计算机当中的数据格式,包括寄存器,内存等;其数值位数是有限的(超出的部分会被丢弃)

例子:

  • 正整数原码: x=+1110 ;x原 = 0,1110 (符号和数值通过逗号隔开)
  • 负整数原码: x=-1110 ;x原 = 10000 - (-1110) = 1,1110;(符号和数值通过逗号隔开)
  • 正小数原码:x=+0.1101;x原=0.1101 (符号和数值通过小数点隔开)
  • 负小数原码:x=-0.1101 ;x原=1 - (-0.1101)  = 1.1101 (符号和数值通过小数点隔开)

  • 【2】补码表示法

    补码定义: 为了把加法和减法合并为加法(归一化),即为了简化算术逻辑单元(ALU)的设计,引入补码让计算机只做加法(把减法转换为加法)

    例: x - y = x + (y)的补码; 这样就可以把减法转换为加法;

    补充: CPU = ALU + CU; 中央处理器=算术逻辑单元 + 控制单元;

    【引入补码的背景】

     以时钟为例:现在是6点;要想时钟走到3点,有两种方法:

    • 方法1: 逆时针拨动3个单元(减3);
    • 方法2: 顺时针拨动9个单元(加9);

    以上两种方法的效果一样(3与9之和为12,mod12),借助以上实例,容易理解补码;

    注意:负小数点补码都是取模2

    为啥是模2,因为负整数x的补码是 2^(n+1) + x ,其中n为整数数值部分位数; 又负小数的整数位数为0,所以负小数的补码等于 2^(0+1)+x = 2+x ;

    以上公式模拟推导过程(转自视频截图):

    问题: -1011的补数为+0101; 那 +0101表示的是 -1011的补数,还是+0101本身呢?

    解决方法:

    正数+0101 表示为 0,0101 (符号位,数值部分)正数补码添上1个0;

    负数-1011 表示为 1,0101 (符号位,数值部分)负数补码添上1个1 ;

    【负数】如何实现在负数补码的符号位设置为1经观察发现(也可以通过数学归纳法证明出来)负数加上2^(n+1) 得到其补码;n为原码的位数

    取模2^(n+1) ;n=数值位数;

    2^(4+1) - 1011=1,0101 ;计算过程如下:

    100000

    -1011

     =11111 – 1011 + 1 = 10100 + 1 = 10101 ;而补码10101是真值-1011的原码1,1011 的数值部分每位取反(得到10100),末位加1获得的;

    【正数】补码也可以通过加上 2^(n+1) 来计算补码

    如正数真值=+1011

    01011

      +100000

      =101011

    红色1被丢弃

    【求补码的快捷方式】

    计算补码快捷方式当真值为负数(注意是负数),原码符号位不变,数值部分每位取反,末位加1即可得到补码;

    例子:

  • 正整数补码:x=+1000110; x原=0,1000110;x补=0,1000110
  • 负整数补码:x=-1010;x原=1,1010;x补=1,0110
  • 正小数补码:x=+0.1010;x原=0.1010;x补=0.1010
  • 负小数补码:x=-0.1010;x原=1.1010;x补=1.0110
  • 例子2:已知 x补 = 0.0001 ,求x(真值);

    • 因为 x补=x;所以x=+0.0001

    例子3:已知 x补=1.0001;求x(真值) ?

    • 因为x补=2+x;
    • 所以x(真) = x补 - 2 = 1.0001 - 10.0000 = -(10.0000 - 1.0001) = -0.1111
    • 所以 x真=-0.1111 ;x原=1.1111 ;x补=1.0001 ;

    通过观察(或数学归纳法证明),我们发现:

  • 补码转原码快捷方式:当真值为负数,则补码符号位不变,数值部分每位取反,末位加1得到原码;
  • 原码转补码快捷方式:当真值为负数,则原码符号位不变,数值部分每位取反,末位加1得到补码;
  • 若X为负数,则【-X】补=【X】补的符号位取反,数值各位取反末位加1;
  • 第3点,以X= -5 为例;

    5的补码,原码均为 0,0101 ;即【5】补=0,0101

    -5的补码等于 1,【-5】原码=1,0101 符号位不变,数值部分每位取反,末位加1,得到

    【-5】补=1,1011;

    得出:【-5】补等于【5】补的符号位取反,数值各位取反末位加1 得到; 


    【3】反码

    反码: 和补码类似,把减法转换为加法;

    通过观察(或数学归纳法证明),我们发现:

  • 反码转原码快捷方式:当真值为负数,则补码符号位不变,数值部分每位取反得到原码(末位不需要加1);
  • 原码转反码快捷方式:当真值为负数,则原码符号位不变,数值部分每位取反得到补码(末位不需要加1);

  • 例子:

    总结

    以上是生活随笔为你收集整理的原码补码与反码的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。