机器数、原码、反码、补码解析

机器数、原码、反码、补码

计算机使用补码进行数字的存储和运算,本文假定机器的字长为8位,探讨下机器数、原码、反码、补码之间的关系

机器数和真值

机器数

  • 计算机中一个数的二进制表示形式,称为这个数的机器数
  • 机器数带符号,在计算机中,用一个数的最高位存放符号,称为符号位,0表示正数,1表示负数

    例:1的机器数为00000001-1的机器数为10000001。此处的0000000110000001即为机器数

真值

  • 带符号位的机器数表示的真实数值称为机器数的真值
  • 因为机器数的最高位为符号位,因此机器数表示的形式值并不一定等于真正的数值(10000001转换为十进制为129,并不代表机器数的真正数值,真值为-1)

    例:00000011的真值为310000011的真值为-3

原码、反码、补码

原码、反码、补码为机器数表示的三种形式,正数的原码、反码、补码都是其本身

原码

  • 原码就是机器数真值的绝对值加上符号位。也就是最高位为符号位,其余位表示数值

    [+1] = 0000 0001

    [-1] = 1000 0001

  • 第一位为符号位,其表示范围

    [1111 1111, 0111 1111]

十进制值为

[-127, 127]

反码

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

    [+1] = [0000 0001] = [0000 0001]

    [-1] = [1000 0001] = [1111 1110]

补码

  • 在原码的基础上,正数的补码也是其原码本身,负数的补码为符号位不变,其余位取反后+1,及反码+1

    [+1] = [0000 0001] = [0000 0001] = [0000 0001]

    [-1] = [1000 0001] = [1111 1110] = [1111 1111]

补码计算

  • 1 - 1 = 0

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

  • (-127) + (-1) = (-128)

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

在用补码运算的结果中,规定 [1000 0000]就是-128,实际上是使用以前的-0的补码来表示-128,所以-128并没有原码和反码表示

  • 因此补码表示范围

[1000 0000, 0111 1111]

十进制值为

[-128, 127]

例如:Java中基本数据类型int为4个字节,32位,可表示的范围:[-231, -231 - 1]

文章作者: DongyangHu
文章链接: http://hudongyang.com/2021/02/24/machine-code/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Sunshine