JAVA基本数据类型及练习题

目录

8种基本数据类型

类型转换

题目


JAVA的数据类型分为:基本数据类型和引用数据类型。本篇博客会介绍基本数据类型及其使用的注意事项,其中包括隐式类型转换、显示类型转换、编译器的常量优化,结尾会给出10道练习题。

8种基本数据类型

字节型

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 类型

JAVA基本数据类型及练习题_第1张图片

而当你进行强制类型转换后,如果值正常,报错消失,如果值太大,超过接收类型的范围,则进行绕圈圈行为。

byte a = 127;
// byte b = a + 1 报错,编译器认为a + 1是int,不能给byte
byte b = (byte)(a + 1); // 输出-128

JAVA基本数据类型及练习题_第2张图片

但是 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的包装类,是引用数据类型,而不是基本数据类型

你可能感兴趣的:(javase,java)