计算机二进制计算过程

计算机二进制计算过程原文 原码 补码和反码 wqbin 博客园 cnblogs com 1 原码 反码 补码的基础概念和计算方法 源码原码就是符号位加上真值的绝对值 即用第一位表示符号 其余位表示值 比如如果是 8 位二进制 1 原 00000001 1 原 第一位是符号位 因为第一位是符号位 所以 8 位二进制数的取值范围就是 0 gt 127 127 反码反码的表示方法是

[原文](原码,补码和反码 – wqbin – 博客园 (cnblogs.com)]

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

  • 源码

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

    [+1]原 = 0000 0001

    [-1]原 = 1000 0001

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

    [1111 1111 , 0111 1111]==>[-127 , 127]

  • 反码

    反码的表示方法是:

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

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

    [-1] = []原 = []反

  • 补码

    补码的表示方法是:

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

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

    [-1] = []原 = []反 = []补

2. 二进制加减法计算过程

计算机以补码进行计算

  1. 1+1 =2

    1+1 == > 0000 0001(1的补码)+ 0000 00001(1的补码)=0000 0010(补码)==> 2

  2. 8-7=1

    8-7=8+(-7)=1

    8+(-7) ==> 0000 1000 (8的原码) + 1000 0111(-7的原码)

    ​ ==> 0000 1000 (8的反码) + 1111 1000(-7的反码)

    ​ ==> 0000 1000 (8的补码) + 1111 1001(-7的补码)

    ​ ==> 1 0000 0001(结果的补码)

    ​ ==> 0000 0001(结果的补码 [去掉溢出位,首位为0正数 为1负数])

    ​ ==> 1(十进制数,正数的补码为他本身)

  3. 8-9=-1

    8-9=8+(-9)=-1

    8+(-9) ==> 0000 1000 (8的原码) + 1000 1001 (-9的原码)

    ​ ==> 0000 1000 (8的反码) + 1111 0110 (-9的反码)

    ​ ==> 0000 1000 (8的补码) + 1111 0111 (-9的补码)

    ​ ==> 1111 1111 (结果的补码)

    ​ ==> 1111 1110(结果的反码)

    ​ ==> 1000 0001(结果的原码)

    ​ ==>-1(十进制数)

3. 为什么使用原码 反码 补码

计算机可以有三种编码方式表示一个数. 对于正数因为三种编码方式的结果都相同:

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

所以不需要过多解释. 但是对于负数:

[-1] = []原 = []反 = []补

可见原码, 反码和补码是完全不同的. 为何还会有反码和补码呢?

首先, 因为人脑可以知道第一位是符号位, 在计算的时候我们会根据符号位, 选择对真值区域的加减. (真值的概念在本文最开头).

但是对于计算机, 加减乘数已经是最基础的运算, 要设计的尽量简单. 计算机辨别”符号位”显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了将符号位也参与运算的方法.

根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法, 这样计算机运算的设计就更简单了.

于是人们开始探索 将符号位参与运算, 并且只保留加法的方法. 首先来看原码:

计算十进制的表达式: 1-1=0

为了解决原码做减法的问题, 出现了反码:

1 – 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0

发现用反码计算减法, 结果的真值部分是正确的. 而唯一的问题其实就出现在”0″这个特殊的数值上. 虽然人们理解上+0和-0是一样的, 但是0带符号是没有任何意义的. 而且会有[0000 0000]原和[1000 0000]原两个编码表示0.

于是补码的出现, 解决了0的符号以及两个编码的问题:

1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原

这样0用[0000 0000]表示, 而以前出现问题的-0则不存在了.而且可以用[1000 0000]表示-128:

(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补

-1-127的结果应该是-128, 在用补码运算的结果中, [1000 0000]补 就是-128. 但是注意因为实际上是使用以前的-0的补码来表示-128, 所以-128并没有原码和反码表示.(对-128的补码表示[1000 0000]补算出来的原码是[0000 0000]原, 这是不正确的)

使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127].

因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是: [-231, 231-1] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227444.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午9:18
下一篇 2026年3月16日 下午9:18


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号