Java中最普遍应用的基本数据类型数据当数int类型,其再内存中占4字节,取值范围为-2147483648~2147483647,这对一般计算足够了,也正因为如此,才更容易疏忽如下情况。
现在编写一个这样的小程序:如果一个人的心脏每分钟跳动70次,他活到70岁,那么他的心脏总共跳动了多少下?似乎这个问题在简单不过了,我们可以不假思索地就写出代码来:
public class HeartbeatTimes { public static void main(String[] args) { int lifeTimes=70*60*24*365*70; System.out.println(lifeTimes); } }
运行结果是:-1719527296
似乎情况不是我们想象的那样,一个人的心跳居然出现了负值!
程序只有一个运算语句,问题肯定出现在这一句代码中,我们用计算器可以算出这一句运算代码的真实结果是2575440000,将其赋值给
lifeTimes,而lifeTimes是一个int类型的变量,其取值方位为-2147483648~2147483647,这已经超过了int类型
所能标示的范围,势必造成lifeTimes的溢出,所以才会造成负值的心跳次数。
修改上面的代码:
public class HeartbeatTimes { public static void main(String[] args) { long lifeTimes=70*60*24*365*70; System.out.println(lifeTimes); } }
为了防止溢出,将lifeTimes修改为long类型,这次应该没有错误了,然而,运行程序后,输出了同样的结果-1719527296。看来需要好好
分析一下这个程序了,lifeTimes已经被声明为long类型,定然不会有溢出的风险。那么错误只能在于“70*60*24*365*70”这个表达
式了。在表达式中,几个操作数都是int类型的常量,而若干个int类型的计算结果即使超出了其所能表达的数值范围,也不会自动进行向更高数据类型的转化
(如自动转化为long)。那么也就是说,其运行结果任为int类型,但其结果已经超过了int类型所能容纳的最大值,所以,溢出便产生了。
既然知道了错误的根源,那么自然也就有了解决的方式,只要让表达式“70*60*24*365*70”的结果为long类型就可以了。在java中,如果低数据类型与高数据类型进行混合运算时,会自动将结果转化为高数据类型(byte、short与char会转换成int类型)。而要做到这一点,也只需增加一个long类型的操作数即可。自然而然,我们很快就会联想到“1L”这个数值,在此修改程序:
public class HeartbeatTimes { public static void main(String[] args) { long lifeTimes=70*60*24*365*70*1L; System.out.println(lifeTimes); } }
这次运行结果为:-1719527296
看来运算结果的表达式还是有错,再次进行分析,整个表达式都是乘法,计算顺序是从左到右,虽然运算结果是long类型的数据,但计算次表达式时并非从开始
(计算70*60时)就知道末尾还有一long类型数据“1L”,即运行结果并非从开始就确定了整个表达式的类型为long,而是在计算过程中,如果遇到
了更高的数据类型(如在int类型的数据运算中遇到long类型的数据)才做必要的转换。因此,当遇到“1L”时,已经计算了
70*60*24*365*70的结果,而此记过依然是存在int类型的数据中,所以,尽管表达式最终计算的结果会因“1L”而转化为long类型,但此
时溢出已经发生了,“1L”并没有起到预期的效果。
再次修改程序,将“1L”放在最前面:
public class HeartbeatTimes { public static void main(String[] args) { long lifeTimes=1L*70*60*24*365*70; System.out.println(lifeTimes); } }
这次,终于输出了我们想要的结果:2575440000
根据刚才的思路,是从低数据类型与高数据类型进行混合运算的角度考虑,才会联想到与“1L”相乘,其实只要把第一个操作数定义为long类型即可。
如:long lifeTimes=70L*60*24*365*70;或者long lifeTimes=(long)70*60*24*365*70;如果改成这样long lifeTimes=(long)(70*60*24*365*70);会得出正确的结果吗?嘿嘿,试试吧!有什么问题或见解,欢迎来八零客
团队博客来讨论,80客团队成员随时欢迎!
相关推荐
零的运算特性很简单,但很容易被忽视。零乘以任何数都等于零,任何数除以零是没有定义的(不是零除以零,那个是未定义),而零的任何次幂(除了零的零次幂在某些定义中是未定义的)都是零。 在进行有理数的混合运算...
在小学六年级的奥数学习中,简便运算是一个非常重要并且实用的部分,它不仅能够帮助学生在面对数学问题时更加得心应手,还能提升他们对数学原理的理解和应用。奥数的简便运算主要侧重于培养学生的运算策略与技巧,让...
首先,我们必须认识到,100以内的加减法是小学生数学学习的一个重要环节,而进位与退位的运算则是其中的难点。进位是指在加法运算中,个位数相加超过10时,将多出的部分加到十位上去;退位则是在减法运算中,当个...
这一步骤很容易被忽视,但却是保证求解正确性的关键。 总结来说,对于考研数学线性代数部分,矩阵乘法和逆矩阵的掌握尤为关键。在复习过程中,考生应当格外注意矩阵乘法的先决条件、交换律的局限性、矩阵乘法与行列...
克里奇洛乘法計算機可能提供了一个直观的输入框让用户输入数字,以及简洁的按钮进行操作。可能还有结果显示区,清晰地显示计算结果,甚至可能包含错误检查和异常处理机制,确保在输入无效或超出预期范围时给出适当的...
在基础乘法教学中,理解10的倍数是一个很好的起点。由于10是基数,它的乘法运算有着特殊的规律性。例如,任何数乘以10,只需在该数后面加一个0即可得到结果。例如,15×10,我们可以先将15理解为15个1,那么10个1是...
在选择数字示波器时,不仅要关注带宽、采样率和存储深度,还需要关注波形刷新率和死区时间这两个容易被忽视的参数。 总的来说,死区时间是数字示波器设计中的一个重要考量因素,它关乎到示波器能否准确、实时地呈现...
通常,这种密码会选取一个密钥K,将明文的每一个字符(假设是数字)与K相乘,然后取结果对一个大整数M取模,得到对应的密文字符。解密过程则需要进行逆运算,即除以K再对M取模。这种方法虽然提高了安全性,但由于...
一个整洁的草稿可以帮助学生更好地展示解题过程,减少因卷面不整洁而扣分的情况。 因此,要改善学生的数学学习效果,必须重视草稿纸的使用。建议学生使用专用草稿本,保持书写清晰,按顺序进行计算和分析。教师应当...
在小学四年级数学的教学中,小数加减法是一个重要的知识点,它标志着学生从整数运算进入到了更为复杂的数字世界。这一阶段的学习不仅要求学生掌握基本的运算规则,还要求他们能够灵活应用到实际问题中去。以下是对人...
例如,在反馈回路并接电容,反馈信号的相位会发生改变,很容易就会发生振荡。为了降低纹波,可以把C3与R1并联,适当增大纹波的负反馈作用,抑制输出纹波。 4. 注意运放的输出摆幅 任何运放都不可能是理想运放,...
在复习的过程中,代数式的书写规范是不可忽视的一个方面。书写规范不仅仅关乎卷面的整洁和清晰,更关乎数学表达的准确性。此外,通过计算题目的练习,如简化代数表达式、确定运算的正确性、计算具体数值等,可以...
例如,用分一分的方法,我们把一个较大的数拆分成较小的单位,这样就更容易进行口算。利用数的组成,我们知道一个数是由几个十、百、千等基本单位组成的,从而更好地理解和掌握除法运算。表内除法和乘法反推除法则为...
在C语言中,不同类型之间的转换如果不谨慎,很容易造成数据丢失或意外的行为。例如,将一个较大的整型值赋给较小的整型变量时,高位的数据会被截断;浮点数与整数之间的转换也可能导致精度丢失。 2. **指针操作...
在逻辑与运算中,如果第一个操作数为假,则不会评估第二个;在逻辑或运算中,如果第一个操作数为真,则不会评估第二个。这在条件赋值和默认参数中很常见。 3. 三元运算符:`条件 ? 结果1 : 结果2`,它是最简洁的条件...
如果不注意,很容易丢失小数点,从而导致计算结果出错。 除了小数乘法,PPT还介绍了小数除法的计算步骤。小数除法首先要在被除数前点上小数点,然后按照整数除法的规则进行计算。过程中需要注意,商的小数点不能...
其次,在移项过程中,要注意等式两边的正负号变化,移项就是变号,这是很多学生容易忽视的。第三,合并同类项时,只合并系数,而变量保持不变,这有助于保持方程的清晰结构。最后,当系数为分数时,常用最小公倍数...
在本主题中,我们将深入探讨“Java基础之计算器”的实现,这是一个典型的编程...同时,这也是一个很好的练习,帮助理解如何将抽象概念转化为实际代码,以及如何调试和优化程序。在实际工作中,这些技能都是必不可少的。