zoukankan      html  css  js  c++  java
  • 补码

    我们都知道在计算机里面,都是用补码来表示数字的,那究竟什么是补码,为什么要使用补码呢?

    什么是补码?

    介绍补码以前,需要先介绍 原码 和 反码。

    原码

    简单的来说就是最高位是符号位的二进制数

    以8位二进制为例,最高位是符号位,其余就是用2进制来表示10禁止了

    [+1]原 = 0000 0001
    [-1]原 = 1000 0001

    反码

    正数的反码是其本身

    负数的反码是, 符号位不变,其余各个位取反.

    [+1] = [0000 0001]原 = [0000 0001]反
    [-1] = [1000 0001]原 = [1111 1110]反

    补码

    正数的补码就是其本身

    负数的补码是其反码+1

    [+1] = [0000 0001]原 = [0000 0001]反 = [0000 0001]补
    [-1] = [1000 0001]原 = [1111 1110]反 = [1111 1111]补

    为什么要用补码?

    因为对于计算机来说,它只有加法,但是没有 减 乘 除。

    就是说减乘除都是通过加法模拟的。

    引入补码后,计算机就可以轻易算法 (-1) + 1 = 0 了

    [+1] = [0000 0001]补
    [-1] = [1111 1111]补
    +1 -1 = [0000 0001] + [1111 1111] = [1 0000 0000]
    // 最高位溢出,忽略, 最终得到 [0000 0000]

    +0 和 -0 的问题

    在引入补码以前,0 有 2 种表示方式:

    [+0] = [0000 0000]
    [-0] = [1000 0000]

    引入补码后,我们就解决了这个问题。

    0 只有 [0000 0000] 这种表示方式:

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

    而 [1000 0000] 用于表示 -128:

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

    小结:引入补码后,我们把 -0 让给了 -128,可表示的范围从 [-127, 127] 扩充到 [-128, 127]。

  • 相关阅读:
    js 第四课
    斐波那契数列(Fibonacci)(递归,非递归)(动态规划,自顶向下,自底向上)
    八种方法计算字符串中特定字符的数量
    谁做对了?
    数组问题
    关于“ORA12988: 无法删除属于 SYS 的表中的列”
    两条路,此人如何问甲乙问题?才能走向京城
    学了快二月的Nhibernate
    温故知新,把牢基础~
    用键盘选择复选框
  • 原文地址:https://www.cnblogs.com/amiezhang/p/11479078.html
Copyright © 2011-2022 走看看