一、一个字节能表示的范围及详解
范围:-128-127
详解:
一个字节有八位,第一位作符号位。0为正,1为负。
1. 正整数
正整数的原码、反码、补码均相同
2. 负整数
负整数的原码为其绝对值后的原码(也就是正数的原码)
反码为原码各位取反
补码为反码基础上+1
eg:-127的二进制表示
原码:127(10) = 0111 1111(2)
取反:1000 0000
补码:1000 0001
二、二进制与十进制的转换
1. 二进制转十进制
整数例子:
小数例子:
2. 十进制转二进制
整数例子:
15(10) = 1111(2)
小数例子:
3.125(10) = 11.001(2)
三、为什么负数到-128,正数最大只有127?
首先,一个字节有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 最合适。
所以,最后一字节的数表示范围就是 127 ~ -128 (256个数)。另外,像KB, MB, GB…都类似于这种存储方式。