目录
8种基本数据类型
类型转换
题目
JAVA的数据类型分为:基本数据类型和引用数据类型。本篇博客会介绍基本数据类型及其使用的注意事项,其中包括隐式类型转换、显示类型转换、编译器的常量优化,结尾会给出10道练习题。
字节型 |
byte |
一个字节 |
-128 ~ 127 |
字符型 |
char |
二个字节 |
0 ~ 2^16-1 |
短整型 |
short | 二个字节 | -2^15 ~ 2^15-1 |
整型 |
int | 四个字节 | -2^31 ~ 2^31-1 |
长整型 |
long | 八个字节 | -2^63 ~ 2^63-1 |
单精度浮点型 |
float | 四个字节 | 1.401298 * 10^(-45) ~ 3.402823 * 10^38 |
双精度浮点型 |
double | 八个字节 |
4.9000000*10^(-324) ~1.797693*10^308 |
布尔类型 |
boolean | 有争议 |
(为什么java的特点叫做“一次编译,到处运行”?因为上面的数据类型的字节大小不管是16位操作系统还是32位操作系统还是64位操作系统,都不变)
对于一个数据类型,给他一个超出其范围的值,报错
byte a = 128; // 报错
int b = 11111111111111; // 报错
为什么int类型的数值范围是 -2^31 ~ 2^31 - 1?
int 有4个字节,一共32位,即int可以表示 2^32个数,正数分一半负数分一半,正数从1 ~ 2^31,负数从 -1 ~ -2^31,但是正数还要表示0,所以最大值减一即 0 ~ 2^31 - 1
(这只是简单的理解,具体参见原码反码补码)
为什么char占两个字节?为什么它没有负数?
1、JAVA使用unicode字符集,里面的各种字符都是两个字节,'a' 、'b'...
2、因为char的第一位不是符号位,所以char 的数据范围为:0 ~ 2 ^ 16-1
在JAVA中,整数值默认为int类型,小数默认double类型。
如:
float a = 1.0; // 报错,1.0是double,不能给float
float a = 1.0F; // 正确
float a = 1.0f; // 正确但不推荐
那为什么可以进行 byte a = 1; 呢?
因为编译器进行了隐式类型转换:byte a = (byte) 1;
隐式/显示类型转换的规则是比较数据范围而不是字节大小,即float可以转为long而long不能转为float。
1、byte/short/char 三种数据类型之间的任意两种进行运算时,都要用int或更大的类型类型接收
//第6行 为错误代码,a + b 系统自动转换为 int 类型,就不能赋值给 short
//第7行 为正确代码,进行强转
//第8行 为正确代码,直接用 int 接收
short a = 1;
short b = 2;
short c = (a + b);
short c = (short) (a + b);
int c = a + b;
编译器在给 a 、b 赋值后将 a 、b 隐式(自动)转换为 int 类型
而当你进行强制类型转换后,如果值正常,报错消失,如果值太大,超过接收类型的范围,则进行绕圈圈行为。
byte a = 127;
// byte b = a + 1 报错,编译器认为a + 1是int,不能给byte
byte b = (byte)(a + 1); // 输出-128
但是 short a = 1 + 2;不会报错,
因为给变量赋值时,如果右侧全是常量,编译器也会进行隐式类型转换,这成为 “编译器的常量优化” ,如果右侧有变量参与,就不能进行这种优化
a++,a += 1;这两种是可以的,是因为+=、++是java语言中的运算符,Java编译器会对它特殊处理进行正确的编译。
short a = 1;
a++;
a += 1;
2、当两种不一样的数据类型进行运算时,会将其中一个较小的数据类型转换成较大的数据类型进行运算
int a = 10;
long b = 10L;
int c = a + b; // 错误,右边已经是long类型了
1、基本数据类型在使用时不初始化能用吗?
答案 :不能
2、JAVA有无符号整型吗?
答案 :无
3、下列错误的选项为:()
A. long a = 11111111111111L;
B. long a = 11111111111111;
C. long a = 189;
D. long a = 189L;
答案:B
解析:编译器认为11111111111111是int,但是他已经超过了int的范围,所以错误
4、下列变量的定义中,正确的是()
A. long a = 123L;
B. long a = 3.14F;
C. float a = 123L;
D. int i = "k";
答案 :C
解析 : 相信你会疑惑,为什么float a = 123L;是正确的,而long a = 3.14F;是错误的呢?因为float的取值范围大于long,long装不下float,所以 long a = 3.14F错误。
5、boolean能转换成其他的基本数据类型吗?
答案 :不能,boolean不能赋值给其他基本类型,同时其他基本类型不能赋值给boolean
6、JAVA的字符类型采用的是unicode字符集,每个unicode码占用____个比特位?
答案 :16,因为俩字节
7、下面哪个表达式是正确的?
A. byte a = 128;
B. Boolean = null;
C. long a = 0xfffL;
D. double = 0.923d;
答案 : C
解析 : 因为B和D没有指定变量,A把128给byte,太大了
8、下列代码第几行会出错?
public void modify() {
int i,j,k;
i=100;
while (i>0){
j=i*2;
System.out.println (" The value of j is " +j );
k=k+1;
i--;
}
}
答案 :7。因为k没有初始化就使用
9、下列语句中正确的是()。
A. System. out. println(1+'1’) ;
B. int i=2+"2";
C. String s="on"+' one’;
D. byte b=257;
答案 :A。
解析 :A.相当于1 + 49;
B.中"2"是字符串,2 + "2" 被转换成字符串,不能赋值给int。
C.单引号代表字符型,它只能有一个字符,'one'有三个。
D.257 > 127
10、下列选项中,不属于Java基本数据类型的是
A. Integer
B. byte
C. char
D. boolean
答案 : A
解析 : Integer是int的包装类,是引用数据类型,而不是基本数据类型