`
羊羊羊
  • 浏览: 13281 次
社区版块
存档分类
最新评论

关于数字运算溢出的推想

    博客分类:
  • java
阅读更多
先说结论:
在进行数字运算时,如果涉及到向上转换,一定要把要转换的标记为先计算的。
如下:
100+1000000*1000000*10L 结果溢出
100L+1000000*1000000*10 结果溢出
100+1000000L*1000000*10 结果正确

详细:
今天写代码时要算N小时之前的时间戳,有如下代码:

int N = 1000;
long queryTime = System.currentTimeMillis() - N * 1000 * 60 * 60;

当N=1000时候溢出了~~~

于是我把代码改成了如下:
long queryTime = System.currentTimeMillis() - N * 1000 * 60 * 60L;

发现结果是正确的,但是我隐约感觉事情有些不对,于是修改代码如下:

long queryTime = System.currentTimeMillis() - N * 1000 * 60 * 60 * 1L;

结果果然不对,还是溢出的。

于是修改代码如下:
long queryTime = System.currentTimeMillis() - 1L * N * 1000 * 60 * 60;

这回对了。

所以推想这个【向上转换】是有转换时间的,不是如果整个表达式中有出现long就全转成long,然后再运算(好像我隐约记得我在哪里看见过这么样的结论)。
1000 * 1000 * 60 * 60 * 1L的运算顺序应该如下:
   1000 * 1000 = 1000000 (int型)
   1000000  * 60 = 60000000 (int型)
   60000000 * 60 = -694967296 (int溢出)
   -694967296 * 1L = -694967296 (先把-694967296转换成long型,值不变,然后乘以1)

同样的道理:
(long)(1000* 1000 * 60* 60) 结果依然溢出
(long)1000* 1000 * 60* 60   结果正确,意义为先把第一个1000变为long

所以最简洁的写法应该为:

1000L* 1000 * 60* 60
分享到:
评论

相关推荐

    C_C++运算中数据类型隐含转换溢出分析

    ### C/C++运算中数据类型隐含转换溢出分析 #### C/C++数据类型的转换 在C/C++编程语言中,提供了多种数据类型以满足不同的编程需求,包括但不限于整型(`int`)、浮点型(`float`、`double`)、字符型(`char`)等...

    python数学运算模块

    python数学运算模块 python数学运算模块 python数学运算模块 python数学运算模块 python数学运算模块 python数学运算模块 python数学运算模块 python数学运算模块 python数学运算模块 python数学运算模块 python数学...

    用“UL”避免Keil C51大整数常量运算溢出错误

    用“UL”避免Keil C51大整数常量运算溢出错误 在Keil C51中,使用整数常量运算可能出现溢出错误,特别是在处理大整数时。这是因为C51编译器的默认类型整数常量运算可能出现溢出错误。如果不指定大整数的数据类型,...

    VHDL语言基本数学运算库-VHDL basic arithmetic library

    了解并熟练使用VHDL的基本数学运算库是进行VHDL设计的关键步骤,这能帮助我们更高效地实现数字逻辑系统,并确保其正确性和可移植性。通过不断的实践和学习,设计师能够掌握如何在VHDL中进行复杂的数据运算,从而实现...

    农村小学中段数学运算律与简便运算能力培养的实践分析课题结题报告.doc

    "农村小学中段数学运算律与简便运算能力培养的实践分析课题结题报告" 本报告旨在探讨农村小学中段数学运算律与简便运算能力培养的实践研究,旨在提高学生的计算能力和简便运算技巧。通过对农村小学中段数学运算律与...

    Verilog 2001 有符号数 的数学运算

    关于Verilog 2001中有符号数的数学运算,有几个重要的概念和知识点: 1. 数据类型:在Verilog 2001中,有多种有符号数据类型,如reg、wire等,都可被指定为有符号,这是与Verilog 1995中仅有整型(integer)作为有...

    数学运算式简单校验

    在编程领域,数学运算式校验是一个常见的任务,特别是在处理用户输入、科学计算或解析数学表达式时。本文将深入探讨如何对数学中的四则运算(加法、减法、乘法、除法)进行合法性校验,以及如何提取运算式中的属性和...

    VHDL数学运算库1.0.zip_vhdl 数学_vhdl 数学库_vhdl 设计 _数学运算

    标签"vhdl_数学"、"vhdl_数学库"、"vhdl_设计"、"数学运算"进一步强调了这个库的核心特性:它是关于VHDL的数学功能,是设计过程的一部分,特别关注于数学计算的实现。这些标签有助于分类和搜索,让其他VHDL设计者能...

    CCS使用及DSP基本数学运算

    CCS使用及DSP基本数学运算 步骤很详细

    专题资料(2021-2022年收藏)关于高中学生数学运算能力的调查问卷.doc

    近期,一份关于“高中学生数学运算能力的调查问卷”引起了教育界人士的广泛关注。该问卷的目的是针对高中生在数学学习尤其是运算能力方面存在的问题,探索提升他们学习兴趣和效率的有效途径。 首先,问卷中对学生的...

    计算机组成原理:第二章溢出问题.ppt

    计算机组成原理中,溢出问题是指在计算机中进行运算时,结果超出机器数表示范围的现象。溢出问题可以分为正溢和负溢两种情况。正溢是指两个正数相加而绝对值超出允许的范围,负溢是指两个负数相加而绝对值超出允许的...

    农村小学中段数学运算律及简便运算能力培养的实践研究报告课题结题报告.doc

    农村小学中段数学运算律及简便运算能力培养的实践研究报告课题结题报告 本报告旨在探讨农村小学中段数学运算律及简便运算能力培养的实践研究,旨在提高农村小学中年级学生的计算能力,解决农村小学中段数学运算律及...

    农村小学中段数学运算律与简便运算能力培养的实践研究课题结题报告.doc

    "农村小学中段数学运算律与简便运算能力培养的实践研究" 通过对文件的标题、描述、标签和部分内容的分析,我们可以提炼出以下知识点: 一、数学课程标准 * 学生必须经历将一些实际问题抽象为数与代数问题的过程,...

    一年级100以内加减混合运算练习600题-1年级加减法混合运算.pdf

    该文件的主要内容是关于一年级学生学习加减混合运算的练习题,文件中包含了多种数学运算规则、数学运算的顺序、数学运算的应用、数学思维模式、数学问题解决方案、数学学习策略、数学知识体系、数学应用场景、数学...

    数学运算模块子程序数学运算模块子程序.rar

    在编程领域,数学运算模块是不可或缺的一部分,尤其是在处理科学计算、数据分析、图像处理以及机器学习等领域。本资源“数学运算模块子程序”显然是一个包含了一系列用于执行数学运算的代码库或者函数集合,由作者...

    超大数字运算的VB6例子(一)

    在实际实现中,超大数字的运算通常基于数学原理,例如对于加法,可以逐位相加并处理进位;对于乘法,可以采用长乘法的方法;而阶乘则需要递归或者循环来完成。为了提高效率,可能会用到一些优化策略,比如在计算过程...

    离散数学 积代数的运算表、单位元、零元

    设V1=, a2}, max >和V2=, b2}, min >是两个数系统, 其中max (x, y)表示x 与y中较大的数;min (x, y)表示 x 与y 中较小的数。...(1)设积代数中的二元运算为*运算,输出它的运算表 (2)输出积代数的单位元和零元

    小学数学运算定律.pdf

    小学数学运算定律.pdf

    四年级数学运算定律及简便运算专项训练题.doc

    "四年级数学运算定律及简便运算专项训练题" 本资源摘要信息是四年级数学运算定律及简便运算专项训练题,旨在帮助学生巩固运算定律的知识,提高简便运算的能力。 一、运算定律 运算定律是数学运算的基础,包括加法...

Global site tag (gtag.js) - Google Analytics