`
haowenxin
  • 浏览: 4521 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
最近访客 更多访客>>
社区版块
存档分类
最新评论

让你很容易忽视的一个整数运算

阅读更多

    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客团队成员随时欢迎!

        本文转载出处:http://www.balingke.com/archives/609.html

分享到:
评论

相关推荐

    七年级上册有理数混合运算专题精选练习含答案.doc

    零的运算特性很简单,但很容易被忽视。零乘以任何数都等于零,任何数除以零是没有定义的(不是零除以零,那个是未定义),而零的任何次幂(除了零的零次幂在某些定义中是未定义的)都是零。 在进行有理数的混合运算...

    小学六年级奥数简便运算(含答案解析).doc

    在小学六年级的奥数学习中,简便运算是一个非常重要并且实用的部分,它不仅能够帮助学生在面对数学问题时更加得心应手,还能提升他们对数学原理的理解和应用。奥数的简便运算主要侧重于培养学生的运算策略与技巧,让...

    一年级_口算练习题_100以内的加减法(进退位运算).pdf

    首先,我们必须认识到,100以内的加减法是小学生数学学习的一个重要环节,而进位与退位的运算则是其中的难点。进位是指在加法运算中,个位数相加超过10时,将多出的部分加到十位上去;退位则是在减法运算中,当个...

    考研数学易混淆概念分析——线性代数(二).pdf

    这一步骤很容易被忽视,但却是保证求解正确性的关键。 总结来说,对于考研数学线性代数部分,矩阵乘法和逆矩阵的掌握尤为关键。在复习过程中,考生应当格外注意矩阵乘法的先决条件、交换律的局限性、矩阵乘法与行列...

    克里奇洛乘法計算機

    克里奇洛乘法計算機可能提供了一个直观的输入框让用户输入数字,以及简洁的按钮进行操作。可能还有结果显示区,清晰地显示计算结果,甚至可能包含错误检查和异常处理机制,确保在输入无效或超出预期范围时给出适当的...

    三年级数学下册第二单元乘法2.1口算乘法课时练北京版202003181173

    在基础乘法教学中,理解10的倍数是一个很好的起点。由于10是基数,它的乘法运算有着特殊的规律性。例如,任何数乘以10,只需在该数后面加一个0即可得到结果。例如,15×10,我们可以先将15理解为15个1,那么10个1是...

    浅谈数字示波器的死区时间.pdf

    在选择数字示波器时,不仅要关注带宽、采样率和存储深度,还需要关注波形刷新率和死区时间这两个容易被忽视的参数。 总的来说,死区时间是数字示波器设计中的一个重要考量因素,它关乎到示波器能否准确、实时地呈现...

    古典加密算法之置换密码和代换密码-羽灵光Fealight

    通常,这种密码会选取一个密钥K,将明文的每一个字符(假设是数字)与K相乘,然后取结果对一个大整数M取模,得到对应的密文字符。解密过程则需要进行逆运算,即除以K再对M取模。这种方法虽然提高了安全性,但由于...

    让我们都来重视数学学习中不应忽视的习惯-草稿纸.doc

    一个整洁的草稿可以帮助学生更好地展示解题过程,减少因卷面不整洁而扣分的情况。 因此,要改善学生的数学学习效果,必须重视草稿纸的使用。建议学生使用专用草稿本,保持书写清晰,按顺序进行计算和分析。教师应当...

    人教版小学四年级数学下册小数加减法教学反思.pdf

    在小学四年级数学的教学中,小数加减法是一个重要的知识点,它标志着学生从整数运算进入到了更为复杂的数字世界。这一阶段的学习不仅要求学生掌握基本的运算规则,还要求他们能够灵活应用到实际问题中去。以下是对人...

    运算放大器使用注意事项

    例如,在反馈回路并接电容,反馈信号的相位会发生改变,很容易就会发生振荡。为了降低纹波,可以把C3与R1并联,适当增大纹波的负反馈作用,抑制输出纹波。 4. 注意运放的输出摆幅 任何运放都不可能是理想运放,...

    江苏省盐城市滨海县第一初级中学七年级数学上册第三章代数式复习无答案新版苏科版

    在复习的过程中,代数式的书写规范是不可忽视的一个方面。书写规范不仅仅关乎卷面的整洁和清晰,更关乎数学表达的准确性。此外,通过计算题目的练习,如简化代数表达式、确定运算的正确性、计算具体数值等,可以...

    人教三年级数学下册除数是一位数的除法时商是整十整百整千数的口算除法PPT学习教案.pptx

    例如,用分一分的方法,我们把一个较大的数拆分成较小的单位,这样就更容易进行口算。利用数的组成,我们知道一个数是由几个十、百、千等基本单位组成的,从而更好地理解和掌握除法运算。表内除法和乘法反推除法则为...

    C语言开发----c语言坑爹大冒险.rar

    在C语言中,不同类型之间的转换如果不谨慎,很容易造成数据丢失或意外的行为。例如,将一个较大的整型值赋给较小的整型变量时,高位的数据会被截断;浮点数与整数之间的转换也可能导致精度丢失。 2. **指针操作...

    javascript表达式和运算符中的一些容易忽略的点共2

    在逻辑与运算中,如果第一个操作数为假,则不会评估第二个;在逻辑或运算中,如果第一个操作数为真,则不会评估第二个。这在条件赋值和默认参数中很常见。 3. 三元运算符:`条件 ? 结果1 : 结果2`,它是最简洁的条件...

    小数乘法总结PPT学习教案.pptx

    如果不注意,很容易丢失小数点,从而导致计算结果出错。 除了小数乘法,PPT还介绍了小数除法的计算步骤。小数除法首先要在被除数前点上小数点,然后按照整数除法的规则进行计算。过程中需要注意,商的小数点不能...

    一元一次方程知识点与经典例题.doc

    其次,在移项过程中,要注意等式两边的正负号变化,移项就是变号,这是很多学生容易忽视的。第三,合并同类项时,只合并系数,而变量保持不变,这有助于保持方程的清晰结构。最后,当系数为分数时,常用最小公倍数...

    Java基础之计算器

    在本主题中,我们将深入探讨“Java基础之计算器”的实现,这是一个典型的编程...同时,这也是一个很好的练习,帮助理解如何将抽象概念转化为实际代码,以及如何调试和优化程序。在实际工作中,这些技能都是必不可少的。

Global site tag (gtag.js) - Google Analytics