Java中关于精度损失的问题探究

目录

一、从一道很有意思的题目出发

二、思考总结


一、从一道很有意思的题目出发

题目:

    ​假设有“int x=1;”,下列代码中,(C)将导致“可能损失精度,找到int需要char”这样的编译错误。

A. short t=12+'a';

B. char c='a'+1;

C.char m='a'+x;

D.byte n='a'+1;

-----------------------------------------------------------------------------------------------

答案选C。

这是因为,当赋值号右边的表达式中有变量时,编译只检查变量的类型,不检查变量中的值。即使在本题中,x已经被赋值,但它仍然是一个变量,编译器在运算'a'+x的时候,并不检查x的值,只检查x是int类型,并认为'a'+x的结果是int类型(这里说明一下,有多个基本数据运算的时候,如果表达式中的最高精度低于int型整数,则按int精度进行计算。所以即使x是byte类型,x+'a'的结果也依然是int类型),所以会有“可能损失精度,找到int需要char”这样的编译错误。

----------------------------------------------------------------------------------------------------------------------------

上述文字中提到“编译器在运算'a'+x的时候,并不检查x的值,只检查x的类型”,这是因为常量值在编译期确定,而变量值要在运行期确定。

ABD中,值其实在编译期间就可以计算出来,并且计算结果是不会超过范围的。

唯独C却不会在编译期间求值,需要在运行期间计算。
这样的话,编译器无法确知结果是否超出范围,所以要给出一个错误。
你可能会问,x不是1吗,但是x是变量,编译器生成让x=1,再让m='a' + x这样的指令,却不会在编译期间越俎代庖的把值计算出来,计算是留到运行期间的。

---------------------------------------------------------------------------------------------

二、思考总结

那么,为什么变量值要等到运行期确定,而常量值就可以直接在编译期确定呢?

首先,我们要知道:

编译期:检查是否有语法错误,如果没有就将其翻译成字节码文件。即.class文件。
运行期:java虚拟机分配内存,解释执行字节码文件。

对于 

  1. final int a=10;  

  1. final int b=20;  

  1. int c=30;  

  1. int d=40;  

  1. int num1=a+b;  

  1. int num2=c*d; 

java编译时会做一些优化操作。第5行,因为是两个常量做运算,那么他们的结果就是确定的,即num1的值是确定的。所以在编译时,编译器就会直接算出num1的值。第6行则不会,java在运行时期才为变量分配内存空间。

所以,变量值要等到运行期确定是因为java在运行期间才会为变量分配内存。

(若有不对或者需要优化的地方,请大家多多指教)

整理日期:2022--3-25

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长安er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值