数据类型和Max+1
java基本数据类型
整数类型
类型 | 字节 | bit | 范围 | 备注 |
---|---|---|---|---|
byte | 1字节 | 8bit | -128~127 | - |
short | 2字节 | 16bit | -32768~32767 | - |
int | 4字节 | 32bit | -2147483648~2147483647 | 默认 |
long | 8字节 | 64bit | -9223372036854775808~9223372036854775807 | - |
浮点类型
类型 | 字节 | 备注 |
---|---|---|
float | 4字节 | - |
double | 8字节 | 默认 |
字符类型
类型 | 字节 |
---|---|
char | 2字节 |
布尔类型
类型 | 字节 | 值 |
---|---|---|
boolean | 不确定 | false/true |
jvm中没有任何供boolean值专用的字节码指令
boolean值,在编译之后都使用Java虚拟机中的int数据类型 ------ 4字节
boolean数组将会被编码成Java虚拟机的byte数组 ------ 1字节
原因:
对于当下32位的CPU,一次处理数据是32位(这里是指的是指CPU硬件层面,不是操作系统),具有高效存取的特点。
自动类型转换
char byte short --> int --> long --> float --> double
char a = 'a';
int i = a; // i = 97
char b = 98; // b = 'b' 不存在类型转换,查表得到b的值
//String 不是基本数据类型
String str = 1 + 2 + "1+2=" + 1 + 2; // str = 31+2=12
强制类型转换
int i = 123;
byte b = (byte)i;
double d = 12.3;
float f = (float)d;
赋值
赋值从右往左进行,会把右边的常量当做默认类型,赋值给左边变量
//这样写会报错
//数值太大,超出int范围
long l = 123456789012
//double类型赋值给float类型,损失精度
float f = 1.23
//正确写法
long l = 123456789012L
float f = 1.23f
// int 与 long运算,自动转换为long类型
long n = 2147483647 + 1L;
System.out.println(n); // print 2147483648
// java中数字默认是 int 类型,运算结果为int类型 然后复制给long
n = 2147483647 + 1;
System.out.println(n); // print -2147483648
数值运算 max + 1 = min
代码:
long l = 9223372036854775807L + 1;
System.out.println("long_Max + 1 = " + l);
int i = 2147483647 + 1;
System.out.println("int_Max + 1 = " + i);
short s = (short) (32767 + 1);
System.out.println("short_Max + 1 = " + s);
byte b = (byte) (127 + 1);
System.out.println("byte_Max + 1 = " + b);
结果:
long_Max + 1 = -9223372036854775808
int_Max + 1 = -2147483648
short_Max + 1 = -32768
byte_Max + 1 = -128
原因:
以 int 类型数据运算为例
0111 1111 1111 1111 1111 1111 1111 1111
+ 0000 0000 0000 0000 0000 0000 0000 0001
-----------------------------------
1000 0000 0000 0000 0000 0000 0000 0000
是不是觉得最高位为 符号位,1000 0000 0000 0000 0000 0000 0000 0000的十进制应该是 -0 ,但是结果却是-2147483648。
因为计算机以补码的形式来存储负数。
为什么呢?为了方便运算如果以原码形式存储运算是这样的:
0000 0001
+ 1000 0001
--------------
1000 0010 即 -2,结果是不对的后来又引入了反码,但是反码并不能对 -0 很好的表示,使得二进制与十进制的互换不再是一一对应的关系。所以被舍弃了,引入了补码
原码 ---> 补码
原码 ---符号位不动取反
--> 反码 ---加1
---> 补码补码 ---> 原码
补码 ---减1
---> 反码 ---符号位不变取反
---> 原码下面这种临界点,被人为规定了其代表值(代替了-0)
-2147483648 ---> 1000 0000 0000 0000 0000 0000 0000 0000
-32768 ---> 1000 0000 0000 0000
-128 ---> 1000 0000
结论:
可以简单的认为,某数据类型表示的范围是一个首尾相连的闭环(eg: min ---> 0 ---> max ---> min)