JAVA基本数据类型及转化

转自https://blog.csdn.net/qq_62939743/article/details/124285287

一、八种基本数据类型

字节型byte一个字节-128 ~ 127
布尔类型boolean一个字节
字符型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.900000010^(-324) ~1.79769310^308

注意:为什么java的特点叫做“一次编译,到处运行”?
因为上面的数据类型的字节大小不管是16位操作系统还是32位操作系统还是64位操作系统,都不变

1、相关问题

1、为什么int类型的数值范围是 -2^31 ~ 2^31 - 1?

int 有4个字节,一共32位,即int可以表示 2^32个数,正数分一半负数分一半,正数从1 ~ 2^31,负数从 -1 ~ -2^31,但是正数还要表示0,所以最大值减一即 0 ~ 2^31 - 1

(这只是简单的理解,具体参见原码反码补码)

2、为什么char占两个字节?为什么它没有负数?

1、JAVA使用unicode字符集,里面的各种字符都是两个字节,‘a’ 、‘b’…

2、因为char的第一位不是符号位,所以char 的数据范围为:0 ~ 2 ^ 16-1

3、在JAVA中,整数值默认为int类型,小数默认double类型。

如果需要将小数声明为float类型,需要在小数后面加F
如:

float a = 1.0; // 报错,1.0是double,不能给float,只有右边含有小数,就无法做常量优化机制
float a = 1.0F; // 正确
float a = 1.0f; // 正确但不推荐

那为什么可以进行 byte a = 1; 呢?
因为编译器进行了隐式类型转换:byte a = (byte) 1;(常量优化机制)

总结:小的类型可以自动转大的类型,但是大的类型转小的类型,两种情况:①强制转换 ②等号右边只有常量没有变量,且全是整数的时候,且不超过范围的值,可以使用常量优化机制,自动转化。

二、类型转换

1、 自动类型转换(隐式类型转换)

  1. 小的类型自动转化为大的类型
  2. 整数类型可以自动转化为浮点类型,可能会产生舍入误差
  3. 字符可以自动提升为整数

例1:int 转double

int a =10;//int, 4个字节

double b = a;//double,8个字节

System.out.println(b); //10.0

2、强制类型转换(显式类型转换)

格式:(type)value
type是要强制类型转换后的数据类型

注意:
1、强制类型转换可能导致溢出或损失精度
2、在把容量大的类型转换为容量小的类型时必须使用强制类型转换、
3、浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入

例1:int 转 byte

int a =10;//int, 4个字节

byte b = a;//byte,1个字节。错误写法,不兼容的数据类型:从int到byte可能有损失精度

byte b = (byte)a;//byte,1个字节。正确写法

注意:
1、当小的数据类型和大的数据类型在一起运算的时候, 小的会先提升为大的之后, 再进行运算。
byte、short、char在运算的时候都会先提升为int然后再进行运算。

2、Java存在常量优化机制
因为给变量赋值时,如果右侧全是常量,编译器也会进行隐式类型转换,这成为 “编译器的常量优化” ,如果右侧有变量参与,就不能进行这种优化

byte d = 3+4;这里的3和4是两个常量,Java会在编译的时候让3和4进行相加,然后回自动判断7是否在byte的取值范围内,如果在范围内通过编译,否则编译出错。

以下代码均满足常量优化机制

short a = 1;
a++;
a += 1;

三、练习题

(1) 对于一个数据类型,给他一个超出其范围的值,报错

byte a = 128; // 报错
int b = 11111111111111; // 报错

(2) byte/short/char 三种数据类型之间的任意两种进行运算时,都要用int或更大的类型类型接收

short a = 1;
short b = 2;
short c =  (a + b);//错误代码,a + b 系统自动转换为 int 类型,int类型比short类型大,就不能自动转换为short类型,也就不能赋值给 short
short c = (short) (a + b);//正确代码,进行强转了
int c = a + b;//正确代码,直接用 int 接收

(3) 进行强制类型转换后,如果值正常,则为正常的值,如果值太大,超过接收类型的范围,则进行绕圈圈行为。

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


byte a= (byte) (128+2);//输出-126

在这里插入图片描述
(4)当两种不一样的数据类型进行运算时,会将其中一个较小的数据类型转换成较大的数据类型进行运算

int a = 10;
long b = 10L;
int c = a + b; // 错误,右边已经是long类型了

(5) 基本数据类型在使用时不初始化能用吗?
答案 :不能

(6) JAVA有无符号整型吗?
答案 :无

(7) 下列错误的选项为:(B)

A. long a = 11111111111111L;
B. long a = 11111111111111;//因为默认是int类型,编译器认为11111111111111是int,但是他已经超过了int的范围,所以错误
C. long a = 189;
D. long a = 189L;

(8)下列变量的定义中,正确的是(B)

A. long a = 3.14F;
B. float a = 123L;
C. int i = "k";

解析 : 相信你会疑惑,为什么float a = 123L;是正确的,而long a = 3.14F;是错误的呢?因为float的取值范围大于long,long装不下float,所以 long a = 3.14F错误。

(9) boolean能转换成其他的基本数据类型吗?
答案 :不能,boolean不能赋值给其他基本类型,同时其他基本类型不能赋值给boolean

(10) JAVA的字符类型采用的是unicode字符集,每个unicode码占用____个比特位?
答案 :16,因为俩字节,一个字节占8位

(11) 下面哪个表达式是正确的?©

A. byte a = 128;//128给byte,太大了
B. Boolean = null;//没有指定变量
C. long a = 0xfffL;
D. double = 0.923d; //没有指定变量

(12) 下列代码第几行会出错?

 public void modify() {
     int i,j,k;//会报错,因为k没有初始化就使用
     i=100; 
     while (i>0){
         j=i*2;
         System.out.println (" The value of j is " +j ); 
         k=k+1;
         i--; 
     }
}

(13) 下列语句中正确的是(A)。

A. System. out. println(1+'1');//字符'1'对应的ASCII码值为49,因为char、short、byte 三种数据类型之间的任意两种进行运算时,都要先转换为int类型,所以结果是50
B. int i=2+"2";//因为"2"是字符串,不能赋值给int  如果改成String i= 2+"2";则结果为22
C. String s="on"+' one’;//单引号代表字符型,它只能有一个字符,'one'有三个。如果改成String s="on"+'o'则结果为ono
D. byte b=257;//257超过byte类型允许的最大值了——127

(14) 下列选项中,不属于Java基本数据类型的是(A)

A. Integer // Integer是int的包装类,是引用数据类型,而不是基本数据类型
B. byte
C. char
D. boolean
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值