以下两个片段执行结果差异的原因是什么?
片段一:
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 | 未定 |
byte | 1字节 |
char | 2字节 |
short | 2字节 |
int | 4字节 |
long | 8字节 |
float | 4字节 |
double | 8字节 |
隐式转换与显示转换概念
隐式类型转换
隐式转换也叫作自动类型转换, 由系统自动完成.
从存储范围小的类型到存储范围大的类型.
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。
最新评论
徒弟可以A师傅,学生可以A老师,为什么外包不能A正式,我觉得很正常。异性相吸这是宇宙真理
PHP天下第一(狗头叼花)
第一个不需要关注公主号直接给激活码的帖子!
客户端超时断开后,服务端如果没有设置超时机制,那也会继续等待处理,万一这期间有消息到了,那不是就接受到消息处理了,但是也没有办法返回到客户端,导致消息丢失。
企业级GO项目开发实战 Kubernetes权威指南 第六版
https://pan.baidu.com/s/1q3bnTncIACKoTZFxvx7BQw?pwd=ii7n
RabbitMQ精讲,项目驱动落地,分布式事务拔高 有吗?
Spring Cloud Alibaba 微服务架构实战 https://pan.baidu.com/s/1jF5voFRoeF0lYAzAPBWSbw?pwd=chqk