• 原码、反码、补码


    预备知识

      由计算机的硬件决定,任何存储于计算机中的数据,其本质都是以二进制码存储,一个二进制称为1个Bit,而8个Bit组成一个字节,字节通常是数据存储的基本单位。

    计算机中的数据存储

    计算机中的存储通常以字节为单位,一个字节数8位,即1B(byte)=8b(bit),一个英文是一个字节,而一个汉字是两个字节。
    假设有4个比特位:
     表示无符号正数,就是0 ~ 15
     表示有符号整数,那么其中一半给到+1 ~ +7,另一半给到-1 ~ -7

    方法1:正数加上负号即对应负数

    既然0010表示+2,那么如果最左边的bit位替换成1就表示对应的负数,即1010表示-2

    0000 0 0100 4 1000 -0 1100 -4
    0001 1 0101 5 1001 -1 1101 -5
    0010 2 0110 6 1010 -2 1110 -6
    0011 3 0111 7 1011 -3 1111 -7
    这就是原码,但是此时会导致出现0和-0,这两个值在数学意义上的意思相同,二进制编码却不同
    并且此时2+(-2)=0010+1010=1100=-4,是时候采用新的编码方法了

    方法2:翻转

    既然0010表示+2,那就将所有进制反转表示负数不就行了,即1101表示-2

    0000 0 0100 4 1111 -0 1011 -4
    0001 1 0101 5 1110 -1 1010 -5
    0010 2 0110 6 1101 -2 1001 -6
    0011 3 0111 7 1100 -3 1000 -7
    这就是反码,此方法也会导致0和-0的二进制值不相同
    此时2+(-2)=0010+1101=1111=-0,也勉强可用,但有没有更好的方法?

    方法3:补码

    在负数反码的基础上如-2(1101)加上(0001)得到(1110)
    此时2+(-2)=0010+1110=10000此时我们可以放心的忽略掉该进位即变成0000=0
    补码表为:

    0000 0 0100 4 1000 -8 1100 -4
    0001 1 0101 5 1111 -1 1011 -5
    0010 2 0110 6 1110 -2 1010 -6
    0011 3 0111 7 1101 -3 1001 -7
  • 相关阅读:
    一次linux启动故障记录
    linux 时间相关的一些总结
    linux 3.10 gro的理解和改进
    linux 3.10 的中断收包笔记
    一个有趣的nginx问题引发的小问题
    linux 3.10 tcp的accept测试
    linux mce的一些相关内容和用户态监控的设计方法
    C/C++(基础-运算符详解)
    C/C++(基础-常量,类型转换)
    C/C++(基础编码-补码详解)
  • 原文地址:https://www.cnblogs.com/cokefentas/p/14754859.html
Copyright © 2020-2023  润新知