一、基本数据类型
基本数据类型:四类八种 | ||||||||
整型 | 浮点型 | 字符型 | 布尔型 | |||||
数据类型 | 字节型 | 短整型 | 整型 | 长整型 | 单精度浮点数 | 双精度浮点数 | 字符型 | 布尔型 |
关键字 | byte | short | int | long | float | double | char | boolean |
包装类 | Byte | Short | Integer | Long | Float | Double | Character | Boolean |
内存占用 |
1 byte 8 bit 1个字节 即8个比特位 |
2 byte 16 bit 2个字节 即16个比特位 |
4 byte 32 bit 4个字节 即32个比特位 |
8 byte 64 bit 8个字节 即64个比特位 |
4 byte 32 bit 4个字节 即32个比特位 |
8 byte 64 bit 8个字节 即64个比特位 |
2 byte 16 bit 2个字节 即16个比特位 |
无 明确规定 |
表示范围 | - | - | - | - | 知道有范围,但一般不关注 | 0 ~ 65535 |
true false |
注意:
计算机的最小单位:bit(比特)
计算机的基本单位:byte(字节)
计算机的最小存储单位:byte(字节)
换算:1 byte = 8 bite ( 1个字节 = 8个比特位 )
1 kb = 1024 byte
1 mb = 1024 kb
1 gb = 1024 mb
二、机器码、真值、原码、反码与补码
在探究各个数据类型所表示范围前,要先引入几个名词解释,即:机器码、真值、原码、反码、补码。
机器码 :现实世界中的一个数字在计算机系统中的二进制表示形式。
以一个byte类型的 +3 举例,
其二进制表示形式为 0000 0011 ,其中第一位 0 表示正数,后七位 000 0011 表示数值 3 ,合起来,就转换为十进制就是 +3 。
以一个byte类型的 -3 举例,
其二进制表示形式为 1000 0011 ,其中第一位 1 表示负数,后七位 000 0011 表示数值 3 ,合起来,就转换为十进制就是 -3 。
真值:带符号机器数真正的数值,被称为该机器的真值。
原码 : 符号位 + 真值的数值位。
如 -3: 1 + 000 0011
如下列计算
1 - 2
= 1 + (-2)
=(0000 0001)原 + (1000 0010)原
=(1000 0011)原
= -3
很显然计算结果是错误的,此时便要引入 反码 的概念。
反码:反码的表示与符号位有关。
正数的反码是其原码本身。
负数的反码是其原码保持符号位不变,其余每一位都取反。
继续进行下列计算
1 - 2
= 1 + (-2)
=(0000 0001)原 + (1000 0010)原
=(0000 0001)反 + (1111 1101)反
=(1111 1110)反
=(1000 0001)原
= -1
1 - 2 是计算对了,但当我们计算 1 - 1 时
继续进行下列计算
1 - 1
= 1 + (-1)
=(0000 0001)原 + (1000 0001)原
=(0000 0001)反 + (1111 1110)反
=(1111 1111)反
=(1000 0000)原
= -0
此时我们得到一个结果是 -0 ,0已经有 0000 0000 来表示了,那多出来的 -0 怎么解决呢 ,此时便要继续引入 补码 的概念
补码:补码的表示与符号位有关。
正数的补码是其原码本身。
负数的补码是其原码的反码再加一。
此时我们继续解决以下计算
1 - 1
= 1 + (-1)
=(0000 0001)原 + (1000 0001)原
=(0000 0001)反 + (1111 1110)反
=(0000 0001)补 + (1111 1111)补
=(0000 0000)补
=(0000 0000)原
= 0
从而得出正确的计算结果,由此我们可以得知 计算机的底层都是补码进行存储。
三、由byte引申的数据类型范围表示
此时我们再回到一开始提到的探究各个数据类型所表示的范围。
由byte来举例子,byte是计算机中的基础单位,也是最小的储存单位。1 byte = 8 bit
显而易见,我们可以计算得到byte类型所表示的范围中的最小值和最大值
最小值
1111 1111
= -(2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0)
= - (64 + 32+ 16 + 8 + 4 + 2 + 1)
= - 127
最大值
0111 1111
= +(2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0)
= + (64 + 32+ 16 + 8 + 4 + 2 + 1)
= + 127
由于补码的存在,已经有一个(0000 0000) +0 ,用来表示0,而多出来的(1000 0000)-0 就视为最小值,作为-128 存在。
实际上 -128 在8位比特下是没有明确的机器码进行表示,只是将(1000 0000)这一特殊的存在来作为最小值,即 -128。
所以8比特位的整数的最小值是 -128 , 所以 byte 的取值范围就是(-128 ~ +127),也可以写作(- ~
-1)。
由数据类型byte可得:
整数类型:
字节型 byte 占 1个字节,即 8个比特位,表示范围是(- ~
-1)。
短整型 short占 2个字节,即 16个比特位,表示范围是(- ~
-1)。
整型 int占 4个字节,即 32个比特位,表示范围是(- ~
-1)。
长整型 long占 8个字节,即64个比特位,表示范围是(- ~
-1)。
浮点数类型:
单精度浮点数 float占4个字节,双精度浮点数 double占8个字节
由于浮点数与整数在内存中的储存方式不同,不能单纯用的形式计算范围,所以知道有范围,但一般不关注。
字符类型:
字符型 char占 2个字节,表示16位Unicode字符,表示范围是(0 ~ 65535)。
布尔类型:
布尔类型 boolean没有明确规定内存占用,范围只有 true 和 false。
四、引申Question:为什么 127 + 1 = -128 ?
1. 通过 127 + 1 进行解释
我们已知,计算机内部的计算都是使用的二进制补码来进行计算的。
127的补码是(0111 1111)
1的补码是(0000 0001)
127 + 1
=(0111 1111)补 + (0000 0001)补
=(1000 0000)补
而二进制补码(1000 0000)所对应的十进制数就是 -128
所以 127 + 1 = -128
2. 通过 127 + 2 进行解释
我们已知,计算机内部的计算都是使用的二进制补码来进行计算的。
127的补码是(0111 1111)
2的补码是(0000 0010)
127 + 2
=(0111 1111)补 + (0000 0010)补
=(1000 0001)补
而二进制补码(1000 0001)所对应的十进制数就是 -127
所以 127 + 2 = -127
则 127 + 1 = -128
3. 通过代码解释
public class HelloWorld {
public static void main(String []args) {
byte a = 127;
a++;
System.out.println(a);
}
}
输出 -128