美文网首页
组成原理计算机数值表示

组成原理计算机数值表示

作者: ffusheng | 来源:发表于2017-05-28 01:44 被阅读0次

    今天偶然碰到补码反码,才发现自己一直搞错了一个事实,n位二进制表示的原码,反码,补码范围是不一样的。于是重新在纸上画一画,总结总结。
    以8位2进制为例:

    码制 范围
    原码 -127 ~ 127
    反码 -127 ~ 127
    补码 -128 ~ 127

    为什么补码会比原码和反码多一个呢?8位2进制编码结果一共有256种。原码和反码127*2+1=255种,而补码是128+127+1=256种。问题是出在0上。

    • 原码:
      0000 0000 - 0111 1111 : 0 ~ 127
      1000 0000 : -0
      1000 0001 - 1111 1111: -1 ~ -127

    • 反码:正数的反码和原码一致,负数的反码是原码除符号位以外取反
      0000 0000 - 0111 1111 : 0 ~ 127
      1111 1111 : -0
      1111 1110 - 1000 0000 : -1 ~ -127

    • 补码:正数的补码和反码一致,负数的补码是反码加1
      0000 0000 - 0111 1111 : 0 ~127
      [1]0000 0000: -0
      1111 1111 - 1000 0001 :-1 ~ -127
      注:[1]截断,则0和-0相同,和数学统一。

    从上面可以看出:[+0]和[-0]的原码和反码都是不一样,而补码是一样的。所以原码和反码只有255个,补码多出一个编码1000 0000没有用,于是规定用这个来表示-128。

    顺便在谈一点为什么计算机采用补码表示数值?

    1. 因为原码和反码中0有2种编码规则,而补码只有一种。
    2. 更重要的是看下面:
      • [1]原 - [1]原 = [1]原 + [-1]原:
        0000 0001 + 1000 0001 = 1000 0001 显然结果是错的。
      • [1]反 - [1]反 = [1]反 + [-1]反:
        0000 0001 + 1111 1110 = 1111 1111 = -0 在数学中0没有正负。
    • [1]补 - [1]补 = [1]补 + [-1]补:
      0000 0001 + 1111 1111 = [1]0000 0000 [1]截断,此时结果为0的补码。正确

    从上面看出,补码运算时不需要考虑符号位的问题,符号位可以直接参与计算,且0的表示方式唯一不分正负,也是符合数理逻辑。

    顺便在谈谈高级语言中,unsigned int和int看来也只不过是编译器对数的解释方式不同,在底层,数的表示是统一的。有时候要注意溢出问题:

    //伪代码
    for (unsigned int8 n = 5; n >= 0; n--){
              ......
    }
    

    这种写法应该是一种死循环,[0]补 - [1]补 = [0]补 + [-1]补 = 0000 0000 + 1111 1111 = 1111 1111。定义为unsigned时,编译器会采用无符号数来解释,于是[1111 1111]补本应该等于1,无符号数时则为512。也就永远不会跳出循环。

    相关文章

      网友评论

          本文标题:组成原理计算机数值表示

          本文链接:https://www.haomeiwen.com/subject/acycfxtx.html