8种基本数据类型
整数类型:byte short int long
浮点类型:float double
字符型:char
布尔类型:boolean
8种基本数据类型在内存中占用的空间大小
byte 1字节 – 8位 -2^7-2^7-1 范围:-128-127
short 2字节 – 16位 -2^15-2^15-1 范围:-2147483648 – 2147483647
int 4字节 – 32位 -2^31-2^31-1
long 8字节 – 64位 -2^63-2^63-1
补充说明:在java中,如果直接给出一个整数,那这个整数默认是int类型
int直接量可以是十进制,八进制,十六进
二进制,十进制,八进制,十六进制
八进制:0-7 写法:057
十六进制:0-9 a b c d e f 写法:0xa9
十六进制:对二进制数进行缩写
十六进制的本质就是二进制
进制间的转换:
二进制转十进制:
Eg:1000 0101
1*2^0+1*2^2+1*2^7
方法:每一位上的值*权重之和
十进制转二进制:
方法:除2取余,余数倒置 14
二进制转16进制:4位表示一位16进制
0101 1010 - 0x5a
16进制转二进制:
0x78 - 0111 1000
long:长整型
如果要定义一个long类型的变量并赋值,要在直接量后面加L/l
如:long l = 23L;
给变量赋值时需要注意数据溢出。
浮点类型:
Java中如果给出一个小数,默认是double类型
float:单精度浮点数
定义: float f = 3.2F/f;
double:双精度浮点数
·· Float和double类型精度问题:
Double和Float在计算机中都是以科学计数法保存数据的。
eg:3.134457777 是以3.13445E1 即3.13445*10^1的形式保存的
float:4个字节,32位, 在这 32 bit 中,
- 1个bit表示符号位, - 8个bit表示指数位, - 剩下的23个bit是有效数字位。
- 2的23次方是8388608,即7位十进制有效数字。 按照这个表示方法转化成10进制之后,它能表示的最高精度是7位有效数字。
float :1位符号位, 8位指数位,23位尾数位
double:1位符号位,11位指数位,52位尾数位
float尾数位23位,2^23=8.3E6,7位,不同的编译器规定不同,有些是7位,有些8位
double尾数52位,2^52=4.5E15,16位,所以double的有效位数是16位 ,编译器不同,有些是15位,有些是16位
赋值举例精度保存:
double d = 3.123456678987657899;
System.out.println(f);
double类型数据进行运算会出现精确问题:
double d1 = 3.0;
double d2 = 2.9;
double d3 = d1-d2;
d3的结果是不精确的。
计算机底层是二进制,二进制中无法精确的表示1/10,就好比十进制中无法精确的表示1/3
二进制中其实没办法保证所有的计算结果都是精确的
因为double类型的数据在进行运算的时候可能会出现不精确的结果,所有java中通常double类型不用于做精确计算。 -
在java中精确表示,需要使用类BigDecimal
字符类型:char
定义:char c = ‘a’;
Char类型字符保存到内存中的是Unicode编码
Unicode编码:国际编码 10万+
保存的是16位无符号整数
Char字符集,每一个字符都和Uncode编码中的一个数字对应
Char字符集 0-65535
Char字符本质是一个16位的无符号整数
了解几个字符对应的Unicode编码:
a:97 b:98
A:65 B:66
中:\u4e2d
中文:\u4e00-\u9af5
每一个字符都对应Unicode编码的一个数字
给char类型的变量赋直接量:
1.‘a’
2. 整数值
3. Unicode编码 \u16进制
boolean:true,false
boolean flag = 5<3;