标签: integer-overflow

如何比较两个纳米时间值?[javadoc混淆]

我已经阅读了javadoc,System.nanoTime()一切看起来都很清楚.直到我到达最后一段:

比较两个nanoTime值

long t0 = System.nanoTime();

...

long t1 = System.nanoTime();

一个应该使用t1 - t0 <0,而不是t1 <t0,因为数字溢出的可能性.

有两件事我不清楚:

  1. 为什么要检查t1 < t0是否t1被带走t0?我的理解是纳米时间总是在增加.所以,我宁愿检查一下t1 > t0.
  2. 让我们假设这是一个错字,他们意味着正确的检查t1 - t0 > 0.我仍然不明白为什么这是正确的检查方式而不是t1 > t0.他们提到数字溢出,我不太明白他们的意思.关于数值溢出,这里提到的是:

因数值溢出连续调用跨越大于约292年(2 ^ 63纳秒)将无法正确计算经过的时间有较大的差异.

好吧,因为纳米时间存储为长值,它最终会在292年内溢出.接下来会发生什么?它是从头开始,即最低负值-2 ^ 63?或者它是否会停止测量并返回(2 ^ 63 - 1)?

java comparison time integer-overflow

19
推荐指数
3
解决办法
1068
查看次数

关于无符号整数下溢的C行为的问题

我已经在很多地方读过,整数溢出在C中定义得很好,与签名对应物不同.

下溢是一样的吗?

例如:

unsigned int x = -1; // Does x == UINT_MAX?
Run Code Online (Sandbox Code Playgroud)

谢谢.

我不记得在哪里,但我在某处读到无符号整数类型的算术是模块化的,所以如果是这种情况那么-1 == UINT_MAX mod(UINT_MAX + 1).

c types integer integer-overflow underflow

18
推荐指数
1
解决办法
2万
查看次数

当通过列表向后循环时,惊慌失措'尝试减去溢出'

我正在编写一个循环方法,用于向索引向前或向后移动索引.以下代码用于向后循环:

(i-1)%list_length
Run Code Online (Sandbox Code Playgroud)

在这种情况下,i属于类型usize,这意味着它是无符号的.如果i等于0,则会导致"尝试减去溢出"错误.我尝试使用正确的转换方法来解决此问题:

((i as isize)-1)%(list_length as isize)) as usize
Run Code Online (Sandbox Code Playgroud)

这导致整数溢出.

我理解错误发生的原因,目前我通过检查索引是否等于0来解决问题,但我想知道是否有某种方法可以通过将变量转换为正确的类型来解决它.

integer-overflow rust integer-arithmetic

18
推荐指数
2
解决办法
9885
查看次数

溢出如何在java中工作?

我已经读过有关溢出的内容,我知道"溢出是指当一个数字如此之大以至于它将不再适合数据类型时,所以系统"回绕"到下一个最低值并从那里开始计数".

例如:

short s = (short)1921222; // Stored as 20678
Run Code Online (Sandbox Code Playgroud)

在那个例子中,我们从-32768 开始计数(Short.MIN_VALUE),但是当我尝试在另一个整数数据类型中进行证明时,它似乎没有相同的工作方式......

byte b = (byte)400; // Stored as -112
Run Code Online (Sandbox Code Playgroud)

上面的例子从0开始计数,这是我发现得到-112的唯一方法

我不知道我做错了什么.

java integer-overflow

18
推荐指数
3
解决办法
2349
查看次数

溢出的无符号整数

unsigned int当我溢出它时会包含什么?具体来说,我想用两个unsigned ints 进行乘法:unsigned int乘法结束后会有什么?

unsigned int someint = 253473829*13482018273;
Run Code Online (Sandbox Code Playgroud)

c++ integer-overflow unsigned-integer

17
推荐指数
2
解决办法
2万
查看次数

固定宽度整数是否超过乘法?

对于三个n位有符号整数a,bc(例如32位)a * (b + c) == (a * b) + (a * c),考虑到整数溢出,总是这样吗?

我认为这是与语言无关的,但如果不是,我对Java的答案特别感兴趣.

java language-agnostic math integer-overflow

17
推荐指数
2
解决办法
860
查看次数

找到两个值的平均值的正确方法是什么?

我最近了解到整数溢出是C中未定义的行为(侧面问题 - 它是否也是C++中的UB?)

经常在C语言编程,你需要找到两个值的平均值ab.但是,这样做(a+b)/2会导致溢出和未定义的行为.

所以我的问题是-什么是找到两个值的平均值的正确方法a,并b用C?

c integer-overflow undefined-behavior

17
推荐指数
3
解决办法
3498
查看次数

乘法发生溢出

long m = 24 * 60 * 60 * 1000 * 1000;
Run Code Online (Sandbox Code Playgroud)

上面的代码创建溢出并且不会打印正确的结果.

long m2 = 24L * 60 * 60 * 1000 * 1000;
long m3 = 24 * 60 * 60 * 1000 * 1000L;
Run Code Online (Sandbox Code Playgroud)

以上2行打印正确的结果.

我的问题是 -

  1. 对我使用的编译器有用,m2还是m3
  2. java如何开始倍增?从左到右还是从右到左?24*60是先计算还是1000*1000计算?

java integer-overflow multiplication

17
推荐指数
4
解决办法
1399
查看次数

可以加倍还是BigDecimal溢出?

Java 8为我们提供了Math.addExact(),但不是小数.

是否有可能doubleBigDecimal溢出?通过Double.MAX_VALUE如何获得最大的BigDecimal值判断我会说答案是肯定的.

因此,为什么我们不也Math.addExact()为这些类型?什么是最可维护的方式来检查这个?

java double integer-overflow bigdecimal

17
推荐指数
2
解决办法
5117
查看次数

添加numpy数组时避免溢出

我想用datatyp uint8添加numpy数组.我知道这些数组中的值可能足够大,可以发生溢出.所以我得到类似的东西:

a = np.array([100, 200, 250], dtype=np.uint8)
b = np.array([50, 50, 50], dtype=np.uint8)
a += b
Run Code Online (Sandbox Code Playgroud)

现在,是的[150 250 44].但是,我希望uint8的值太大而不是uint8允许的最大值,而不是溢出.所以我想要的结果就是[150 250 255].

我可以使用以下代码获得此结果:

a = np.array([100, 200, 250], dtype=np.uint8)
b = np.array([50, 50, 50], dtype=np.uint8)
c = np.zeros((1,3), dtype=np.uint16)
c += a
c += b
c[c>255] = 255
a = np.array(c, dtype=np.uint8)
Run Code Online (Sandbox Code Playgroud)

问题是,我的数组非常大,因此创建具有更大数据类型的第三个数组可能是内存问题.是否有一种快速且更有效的内存方式来实现所描述的结果?

python numpy image-processing integer-overflow numpy-ndarray

16
推荐指数
3
解决办法
5279
查看次数