查看原文
其他

Java笔试题库(10期)

2017-11-13 阿木侠 Java知音


前言:

最近一直没有整理笔试题,也是工作太忙,笔试题整理稍复杂,总担心因为自己的疏忽或者技术不精而误人子弟,昨天群里小伙伴问了一个很有意思的问题,这里拿出来给大家看看。


以下两个片段执行结果差异的原因是什么?

片段一:

short s=1;
s=s+1;


片段二:

short s=1;
s+=1;


可以自己组织一下答案,最后看结论


结论分析:

片段一自然是编译不通过的 ,提示损失精度 。


那么片段二为什么能编译通过呢? 

        隐式类型转换可以从小到大自动转,即byte->short->int->long,如果反过来会丢失精度,必须进行显示类型转换。


        回到这一题来看,s+=1的意思与s = s+1不同,s=s+1这句先执行s+1然后把结果赋给s,由于1为int类型,所以s+1的返回值是int,编译器自动进行了隐式类型转换,所以将一个int类型赋给short就会出错。


        而s+=1不同,由于他是使用+=操作符,在解析的时候s+=1就等价于s = (short)(s+1),也就是s+=1 <=> s =  (s的类型)(s+1)。

(最后结论引自百度知道,略有删改。

解答出处:https://zhidao.baidu.com/question/250880637.html)


扩展:

基本类型数据及所占字节

数据类型所占字节
boolean未定
byte1字节
char2字节
short2字节
int4字节
long8字节
float4字节
double8字节


隐式转换与显示转换概念

 隐式类型转换

隐式转换也叫作自动类型转换, 由系统自动完成.

从存储范围小的类型到存储范围大的类型.

byte ->short(char)->int->long->float->double

 显示类型转换

显示类型转换也叫作强制类型转换, 是从存储范围大的类型到存储范围小的类型.

当我们需要将数值范围较大的数值类型赋给数值范围较小的数值类型变量时,由于此时可能会丢失精度,因此,需要人为进行转换。我们称之为强制类型转换。

double→float→long→int→short(char)→byte

基本数据类型之间的转换规则

1.在一个双操作数以及位运算等算术运算式中,会根据操作数的类型将低级的数据类型自动转换为高级的数据类型,分为以下几种情况:

1)只要两个操作数中有一个是double类型的,另一个将会被转换成double类型,并且结果也是double类型;

2)只要两个操作数中有一个是float类型的,另一个将会被转换成float类型,并且结果也是float类型;

3)只要两个操作数中有一个是long类型的,另一个将会被转换成long类型,并且结果也是long类型;

4)两个操作数(包括byte、short、int、char)都将会被转换成int类型,并且结果也是int类型。  

2. 如果低级类型为char型,向高级类型(整型)转换时,会转换为对应ASCII码值,再做其它类型的自动转换。

3. 对于byte,short,char三种类型而言,他们是平级的,因此不能相互自动转换,可以使用下述的强制类型转换。 如:

short i=99 ;
char c=(char)i;
System.out.println("output:"+c);

4. 不能在布尔值和任何数字类型间强制类型转换;

5. 不同级别数据类型间的强制转换,可能会导致溢出或精度的下降。

6. 当字节类型变量参与运算,java作自动数据运算类型的提升,将其转换为int类型。

例如:

byte b;
b=3;
b=(byte)(b*3);//必须声明byte。

推荐阅读

 


springboot系列教程学习


Javaweb练手项目源码下载


精选Javaweb相关视频教程


100套IT类简历模板下载



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存