TOGOUTECH

integer-overflow

全部标签

c++ - 浮点/整数类型转换的可靠溢出检测

有没有安全的方法来可靠地确定整数类型T可以存储浮点整数值f(所以f==floor(f))没有任何溢出?请记住,不能保证浮点类型F与IEC559(IEEE754)兼容,并且有符号整数溢出是C++中的未定义行为。我对根据当前C++(写作时为C++17)标准正确且避免未定义行为的解决方案感兴趣。以下天真的方法并不可靠,因为无法保证类型F可以代表std::numeric_limits<I>::max()由于浮点舍入。#include<cmath>#include<limits>#include<type_traits>template<ty

c++ - "Int"c++ 与 "long long"结果的乘法

这个问题在这里已经有了答案:Squaringnumberinc++,Kaprekarnumbers[duplicate](3个答案)关闭6年前。我正在尝试计算int的平方。我的代码如下所示:longlongsqr=0;intnum=77778;sqr=num*num;结果应该是6049417284但是当我检查输出时,它显示1754449988。我在做什么错误?longlong应该能够存储结果,但为什么我得到了不同的值?

c++ - c++ 中的 int(或 long long)溢出如何影响模数?

假设我有两个longlong,a和b,我需要相乘,然后得到一些大k的modk值,这样a、b和k都在longlong的范围内,但不在诠释。为简单起见,a,b因此代码将是:longlonga,b,k;cin>>a>>b>>k;cout<<(a*b)%k<<"\n";但是,因为a和b太大了,如果像上面那样相乘,溢出变成负数,那么modk就是负数,不正确。如何确保modk的值是正确的?编辑:作为奖励,这在Java中是如何工作的?是不是和预想的一样?还是需要BigInteger? 最佳答案

c++ - 如何检测无符号整数溢出?

我正在用C++编写一个程序来查找ab=c的所有解,其中a、b和c一起使用所有数字0-9恰好一次。该程序循环遍历a和b的值,并且每次在a、b和ab检查是否满足数字条件。但是,当ab溢出整数限制时,可能会生成伪解。我最终使用如下代码检查了这一点:unsignedlongb,c,c_test;...c_test=c*b;//Possibleoverflowif(c_test/b!=c){/*Therehasbeenanoverflow*/}elsec=c_test;//Nooverflow是否有更好的溢出测试方法?我知道有些芯片有一个内部标志,会在发生溢出时设置,但我从未见过通过C或C++访

java - 两个签名 Java 'long' 值的饱和加法

如何在Java中添加两个long值,以便在结果溢出时将其限制在Long.MIN_VALUE..Long.MAX_VALUE范围内?要添加整数,可以执行long精度的算术并将结果转换回int,例如:intsaturatedAdd(intx,inty){longsum=(long)x+(long)y;longclampedSum=Math.max((long)Integer.MIN_VALUE,Math.min(sum,(long)Integer.MAX_VALUE));return(int)clampedSum;}或importcom.google.common.primitives.I

Java乘法运算行为

我写了一个方法将给定数字从天数转换为毫秒数:privatelongexpireTimeInMilliseconds;...publicvoidsetExpireTimeInDays(intexpireTimeInDays){expireTimeInMilliseconds=expireTimeInDays*24*60*60*1000;}我很难弄清楚我做错了什么。现在我的问题:这个错误这么明显吗?修正方法:privatelongexpireTimeInMilliseconds;...publicvoidsetExpireTimeInDays(intexpireTimeInDays){ex

java - 为什么这个乘法整数溢出会导致零?

回答后thisquestion,我很困惑为什么这段代码中溢出的整数导致0而不是负数。很奇怪,为什么会有这么精确的数字?为什么是0?publicclassIntegerOverflow{publicstaticvoidmain(String[]args){intx=10;inti=0;for(i=0;i<=5;i++){x=x*x;System.out.println(x);}}}输出:10010000100000000187491942400 最佳答案 只有当x的起始值为偶数时才会发生这种情况。根据JLS§15.17.1:If

java - 为什么,在 Java 算法中,上溢或下溢永远不会抛出异常?

在JavaArithmetic操作期间,JVM不会抛出Underflow或OverflowException。很多时候我们遇到意想不到的结果,想知道哪里出了问题。而在.NET技术的情况下,我们有溢出和取消流异常。所以我的问题是,为什么Java被设计成在算术运算期间不抛出这个异常 最佳答案 这可能是多种因素的结合:Java之前的主流语言使用未经检查的算术。容易出现数值溢出的著名算法倾向于在不依赖已检查算术的情况下解决潜在的溢出问题。经过检查的算术在大量使用算术指令的算法中引入了显着的开销,这会使Java处于明显的劣势,尤其是在基准测试

java - 如何修复整数溢出产生的错误数字?

我有一个导致整数溢出的错误,导致错误(负)时间戳被写入数据库。代码已经修复,但我也想修复错误的数据。我想,我可以只取错误的结果并添加Integer.MAX_VALUE,但这似乎不起作用,它让我得到了很高的值。我在下面的代码片段中有offset值,但未存储输入值。以下代码重现了该错误:@TestpublicvoidtestArexxConversion(){//Theinputvaluesrepresentsecondssincemidnight,Jan1,2000UTCfinalintsample=361450072;//Asampleinputvaluedrawnfromproduc

javascript - "Simulate"JavaScript 中的 32 位整数溢出

JavaScript可以很好地处理以下数学运算:varresult=(20000000*48271)%0x7FFFFFFF;但在某些编程语言中,第一个int*int乘法会导致值太大而无法用标准的32位整数保存。有什么方法可以在JavaScript中“模拟”这个,看看如果乘法导致整数溢出,计算结果会是什么? 最佳答案 可以通过“滥用”JavaScript中可用的按位运算符来模拟32位整数(因为它们只能返回该范围内的整数)。转换为带符号的32位整数:x=(a*b)|0;转换为无符号32位整数:x=(a*b)>>>0;