基础数据类型详解
1 基础数据类型分类
1.1 整数型数据类型
各种基础数据类型所占字节数的大小(单位Byte)
整数型数据 byte 1 short 2 int 4 long 8
小数型数据 float 4 double 8
字符型数据 char 2
布尔型数据 boolean 1 12345
数据类型所占空间的大小:
byte — 字节型数据类型,在内存中占用1个Byte,所能
表示的范围是多少?-128~127
short— … 在内存中占用2个Byte,所能表示的范围
是多少?-32768 ~ 32767
int ---- 整型 在内存中占用4Byte,所能表示的范围是多
少?-2147483648 ~ 2147483647
long — 长整型 在内存中占用8Byte
在java中,定义整数型数据的时候,如果字面量是十进制的数值,
那么java会自动默认为int型。
也就是说:int short byte long 这几个,只要后面跟的
是十进制的整数,那么它们都被默认为int型
Test01.java:12: 错误: 不兼容的类型: 从int转换到
byte可能会有损失
byte b = -129;
为什么有损失?怎么损失的?
class Test01
{
public static void main(String[] args) 123456789
10
11
12
13
14
15 {
16 //基础数据类型–8种基本数据类型
17 // int short long byte 这四种是整数
18 // float double 这两种是小数
19 // char 这种是字符
20 // boolean 这种是true false
21
22 // byte b = -128; //这样可以
23 byte b = (byte)300;
24 System.out.println(b); // 这个结果是多少?
25
26 byte m = -1;
27 // 第一步,-1这个字面量被默认为int型,它的存储
方式为:11111111 … 11111111
28 // 第二步,在byte取值范围内,会自动截掉前面3个
Byte,只留下最后一个Byte,
29 // 因为,前面的全是0以及符号位
30 // 第三步,只保留最好一个字节,该字节中存储的是
该字面量的补码形式(正数的原码、反码、补码都一样)
31 // 负数的补码需要计算,我们需要的是原
码,
32 // 拿到的是补码,补码先-1,然后符号位
不变,按位取反,得到原码
33
34 System.out.println(m);
35 /*
36 E:\java基础\1-20-2>javac Test01.java
37 Test01.java:12: 错误: 不兼容的类型: 从int转换到
byte可能会有损失
38 byte b = -129;
39 ^
40 1 个错误
41 */
42 // short s = 32767;
43 }
44 }
45
1.2 关于计算机内存中存储的二进制
1.3 long和int的区别
记住,在计算机内存存储的二进制都是以补码的形式进行存储,在
内存中第一位表示符号位,0表示正,1表示负
什么是补码?
对于一个正数来说,它的原码、反码、补码都一个样
如:10的原码:00000000 00000000 00000000
00001010
对于一个负数来说,它的原码、反码、补码是什么样子的、
原码很简单,就是一个整数的二进制表示,第一位是符号位
如:-1的原码:10000000 00000000 00000000
00000001
反码:符号位不变,其他位取反也就是说,原来是0的要
变成1,是1的要变成0,记住符号位不变
-1的反码:11111111 11111111 11111111
11111110
补码:反码+1
-1的补码:11111111 11111111 11111111
11111111
123456789
10
11
class Test01
{
public static void main(String[] args)
{ 1234
1.4 float 和 double
// long l = 3000; // 这样可以吗。我们知道
3000 默认为int型,直接给long赋值可以吗?
// 对于long来说,它有8Byte,int是4Byte,所以
能够直接转换
//long l = 2147483648; // 这样写可以吗?为什
么?
// 这样做不可以,编译不通过。
// 因为整型的字面量会被默认为int型,2147483648
超出了int的范围。所以编译器报错。
/*
E:\java基础\1-20-2>javac Test01.java
Test01.java:7: 错误: 整数太大
long l = 2147483648;
// 这样写可以吗?为什么?
^
1 个错误
*/
long l = 2147483648L;// 这样做就可以让编译器
编译通过。
// 3000 和 3000L有什么区别?从字面量上看,没啥
区别,但是实质上有本质的区别
// 3000 是int型,只要4Byte装,3000L是long, 要8个Byte装。
// 大写的L和小写的l都可以,但是l和1好像不太好区
分,所以建议大家都用L
System.out.println(l);
} } 56789
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Test01
{
public static void main(String[] args)
{
float pi = 3.14; 12345
6 double pi2 = 3.1415926; 78 System.out.println(pi);
9 System.out.println(pi2);
10 }
11 }
12 编译器报错:
13 E:\java基础\1-20-2>javac Test01.java
14 Test01.java:5: 错误: 不兼容的类型: 从double转换到
float可能会有损失
15 float pi = 3.14;
16 ^
17 1 个错误
18
19
20 class Test01
21 {
22 public static void main(String[] args)
23 {
24 float pi = 3;
25 double pi2 = 3.1415926;
26
27 System.out.println(pi);
28 System.out.println(pi2);
29 }
30 }
31 编译通过。
32
33 E:\java基础\1-20-2>javac Test01.java
34
35 E:\java基础\1-20-2>java Test01
36 3.0
37 3.1415926
38
39
40 为什么?
1.5 char
- 只要是字面量为小数,系统默认为double型的,double占了
8个字节,float只占了4个字节 - 如果给的字面量是整数,它就编译通过了呢?因为int是4字
节,float也是4字节的,所以能通过。 - 补充,float比long所表示的范围要大。这个东西希望你们记
住就可以了,float占4个字节,long占8个字节,但是float要 比long大。 - 定义float类型的变量,其后的字面量为小数一定要带F
41
42
43
44
class Test01
{
public static void main(String[] args)
{
// float pi = 3.1;
double pi2 = 3.1415926;
char c = ‘a’; // 2Byte
int cc = ‘a’;
char ch = 98; // 这样行不行?
char ch1 = 32767;// 这样可以吗?可以啊。没有
越界,因为char是2Byte
char ch2 = -32767;// 这样可以吗?不可以。为什
么呀?因为char是没有负数取值的
System.out.println(ch2);
System.out.println(pi2);
} }
class Test01
{
public static void main(String[] args)
{
char c = ‘a’; // 2Byte
int cc = c; // 这样可以
123456789
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 System.out.println©;
25 System.out.println(cc);
26 }
27 }
28
29 class Test01
30 {
31 public static void main(String[] args)
32 {
33 int c = ‘a’;
34 char cc = c; // 这样可以,因为c是
int型的变量,它是4Byte的,如果直接赋值给char,这样编译器
是无法识别的。
35 System.out.println©;
36 System.out.println(cc);
37 }
38 }
39
40 编译会报错:
41 E:\java基础\1-20-2>javac Test01.java
42 Test01.java:6: 错误: 不兼容的类型: 从int转换到char可
能会有损失
43 char cc = c; // 这样可以吗?
44 ^
45 1 个错误
46
47
48 结论:在基础数据类型中,如果大转小,不强制类型转换,编译是
通不过的。
49
50 class Test01
51 {
52 int i = 10; // 1
53
54 int i; // 2
55 int j = 10; // 2
1.6 boolean
i = j; // 2
// 请问1 和 2 等价吗?是一样的吗?不一样
public static void main(String[] args)
{
int c = ‘a’;
char cc = c; // 这样可以吗?为什么?
System.out.println©;
System.out.println(cc);
// 整数型的字面量都默认为int
short i = 10;
// 拆分 我们以前说这样的方式是等价的,到底等不等
价呢?其实不等价!!!!!!
int j = 10;
short i = j;
} }
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
class Test01
{
public static void main(String[] args)
{
boolean flag = true;// flase
int j = (int)flag;// 这样可以吗?
/*
E:\java基础\1-20-2>javac Test01.java
Test01.java:6: 错误: 不兼容的类型:
boolean无法转换为int
int j = (int)flag;//
这样可以吗?
^ 123456789
10
11
12 1 个错误
13 */
14 System.out.println(j);
15 }
16 }