3.4.1 计算机数据存储方式
为了更好地理解Java基本数据类型的宽度和存储范围,以及计算规则,我们先来了解一下计算机底层存储数据的方法。
计算机的世界里只有0和1,这就是我们所说的二进制。大家熟悉的是十进制,十进制的数字范围是0~9,遵循逢十进一的原则,二进制的数字范围是0~1,遵循逢二进一的原则。例如,十进制中的2,用二进制表示就是10。
在计算机中存储的所有数据都要转换为二进制。计算机最小的存储单位就是比特(bit),每个bit位上只能存储0或1。但是,bit实在是太小了,所以通常我们在说存储单位时,往往使用字节(byte),一个byte等于8个bit位。Java的数据类型是跨平台的,以byte为例,无论你的机器是32位还是64位,byte类型都是1字节。
另外,为了表示数学中负数和正数的概念,规定一个二进制数的最高位(最左边的位)为符号位,1表示负数,0表示正数。以1字节为例,10011000表示负数,00111011表示正数。
为了能够让符号位也参与到运算中,计算机科学家们找到了一种特殊的数据表示方式,提出了原码、反码、补码的概念。正数的原码、反码、补码都一样,负数的原码、反码、补码却不相同。不管是正数,还是负数,计算机的底层都是用补码形式存储数据的。负数的原码、反码与补码之间的关系如下所示。
● 原码就是将某个数据转换为二进制的原始形式,并且最高位的1表示负数,0表示正数。例如,正数2的二进制原码是00000010,负数2的二进制原码是10000010。
● 反码就是在原码的基础上,符号位不变,其余位数取反。例如,负数2的二进制原码是10000010,负数2的二进制反码是11111101。
● 补码就是在反码的基础上加1。例如,负数2的二进制反码是11111101,负数2的二进制补码是11111110。
● 问题思考:那么1字节能表示多大的数据范围呢?
1字节能表示的正整数范围是00000001~01111111,对应的十进制是1~127;负整数范围是10000001~11111111,对应的十进制是-127~-1。
那么整数0用什么表示呢?00000000用来表示0,10000000用来表示-128,这是因为-127的二进制是10000001,而-127-1的二进制就是10000000,它对应的十进制就是-128。
以上就是1字节的整数转换为二进制的方法。其他整型数据的最高位仍然为符号位,仍然有原码、反码、补码的概念,只是表数的字节范围不同,这里不再赘述。下面重点讲解Java中规范的几种基本数据类型。