一、基本单位
bit (比特):
表示二进制位,位是计算机内部数据储存的最小单位,逢二进一。一个二进制位可以表
示0, 1两种状态,两个二进制位可以表示00, 01, 10, 11四种状态 …
byte (B, 字节):
八个二进制位(bit)为一子节(byte),字节是计算机中数据处理的基本单位。
一个字节数通常有三种表示,即原码, 反码和补码。
二、原反补码
正整数 :
原反补码相同,都是正整数的二进制表示
负整数 :
原码 :
数值的二进制
反码:
原码各个位取反
补码:
反码的基础上加1
三问题分析
首先,一个字节有8位二进制位,理论上可以储存的数量为 2^8 即256。由于数字需要进行相应的运算(+ - * / …),所以我们希望256个数里面能够包含相应的负数,然而二进制本身没有表示负数。
所以,规定字节的第一个位是符号位,并且0表示正数,1表示负数。比如001001011表示正数,110100011表示负数。
这样一来,正数就能表示 2^7 即 127 ~ 0 之间的数,负数则能表示 - 2^7 即 -127 ~ 0 之间的数字。这就对于0的存储出现了重复, “+0” 即00000000 和 “-0” 即10000000。逻辑上来说 “+0” 和 “-0”同时存在,显然不合理,存储上来说 “+0” 和 “-0” 表示一个数但是占用了两个存储位,也不合理。
既然0重复不合理,那么是否可以只保留一种作为0的表示,另外一种作为其他数的表示呢?如果可以的话,不就解决了逻辑上和存储上的问题了吗?
那么到底是保留 “+0” 还是 保留 “-0” 呢?去除掉的那个“0”又表示什么数呢?首先,当前一个字节已经可以保存 127 ~ -127 (0重复) 即255个数。对于额外保存的数,我们当然是希望保存这个范围之外的数,并且最好“接壤” 127 ~ -127这个范围,那么优先考虑 128 和 -128。我们知道,字节的存储其实是使用补码来表示的,-127的补码是 10000001,这个数字 减1 刚好是 “-0” 10000000,-127 减1 等于 -128,所以这里将 “-0” 10000000 表示 -128 最合适。