二进制
提示
计算机在底层存储数据的时候,一律存储的是二进制的补码形式,采用该模式的原因是补码形式效率最高。
- 对一个整数来说,二进制原码、反码、补码相同
- 对一个负数来说
- 原码:最高位为符号位,其余为数据位
- 反码:原码的符号位不变,其他位取反
- 补码:反码 + 1
例如:分析byte b = (byte) 150,这个b是多少?(答案:-106)
- int类型的4个字节的150的二进制码是00000000 00000000 00000000 10010110
- 将以上的int类型强制类型转换为1个字节的byte,最终在计算机中的二进制码是:10010110
- 10010110是二进制补码形式
- 10010101是二进制反码形式(补码-1)
- 11101010是二进制原码形式(符号位不变,其他位取反)
将11101010(原码)转换为十进制为-106
二进制加1正常计算
- 1 + 0 = 1
- 0 + 1 = 1
- 1 + 1 = 10(这里末位置为0,上一位继续加1,依次计算)
速算小技巧
负数的补码这样记,原码转补码:符号位不变,其他的从低位开始,直到遇见第一个1之前什么都不变,遇见第一个1之后保留这个1,以后按位取反。 例如:[-7]原:10000111,[-7]补:11111001 [-106]原:11101010,[-106]补:10010110
为什么Byte的范围是-128~127?
很多人对127很容易理解,但是对-128不知道怎么来的,这里告诉大家一句话,就全明白了:在补码表示中,最高位(符号位)表示数的正负,在形式上与原码相同,即 0正 1负。但补码的符号位是数值的一部分,由补码定义式计算而得。也就是说,补码的符号位参与运算。 在计算机系统中,数值一律用补码来表示和存储。以byte类型为例:数值0(无论正负)的补码标识唯一,为0000 0000,最大值:01111111=127,即2的7次方减去1;最小值:10000000即2的7次前面加个负符号:-128。 负数补码转十进制数,有三种方法(a)把符号位抛弃,取反,再加1,得到负数绝对值,转换为十进制,再加上负号即可;(b)连同符号位一起取反,再加1,得到负数绝对值,转换为十进制,再加上负号即可;(c)直接算,如:111:(-1)(2^2)+ 1(2^1)+ 1*(2^0)= -1。