二进制的反码
2017-07-24 12:03 ZengGW 阅读(1207) 评论(0) 编辑 收藏 举报c语言的二进制数有三种表示方法:原码、反码、补码 , 主要讲反码(8位机器)
什么是反码呢?
正数:它的反码就是它本身
负数:它的反码在其原码的基础上, 符号位(什么是符号位?二进制表示正数负数使用二进制的最高位为1表示负数,0表示正数)不变,其余各个位取反
比如:-1 = 10000001 - 符号位不变,其他位取反 -> 11111110
+1 = 00000001 - 正数的反码就是它本身 -> 00000001
计算:1 + (-1) = 00000001 + 11111110 = 11111111(再取反) = 10000000 = -0(其实+0和-0没有什么区别)
结果:发现用反码计算减法, 结果的真值部分是正确的. 而唯一的问题其实就出现在"0"这个特殊的数值上. 虽然人们理解上+0和-0是一样的, 但是0带符号是没有任何意义的. 而且会有[0000 0000]原和[1000 0000]原两个编码表示0,于是就出现了补码表示法来解决这种问题
注:原码, 反码和补码是完全不同的. 既然原码才是被人脑直接识别并用于计算表示方式, 为何还会有反码和补码呢?
因为:首先, 因为人脑可以知道第一位是符号位, 在计算的时候我们会根据符号位, 选择对真值区域的加减. (真值的概念在本文最开头). 但是对于计算机, 加减乘数已经是最基础的运算, 要设计的尽量简单. 计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了将符号位也参与运算的方法. 我们知道, 根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法, 这样计算机运算的设计就更简单了