标签: integer-overflow

为什么不溢出?

鉴于此代码:

int x = 20000;
int y = 20000;
int z = 40000;

// Why is it printing WTF? Isn't 40,000 > 32,767?
if ((x + y) == z) Console.WriteLine("WTF?");
Run Code Online (Sandbox Code Playgroud)

知道一个int可以容纳-32,768到+32,767.为什么这不会导致溢出?

.net c# int integer-overflow visual-studio

2
推荐指数
3
解决办法
453
查看次数

Jiffies Counter Over Flow案例+ Linux

Jiffies计数器返回一个大小为四字节的无符号整数.当计数器达到最大值时,它再次从0重新开始.我将用旧值减去最新值以获得持续时间.那么我应该如何考虑这样一种情况:当旧值具有最大值并且新值大于零时,我将得到错误的持续时间?

linux math counter integer-overflow

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

Coverity中溢出的返回值警告

我正在为下面的一段代码获得一个覆盖静态检查工具警告.

   double value = 0;
   std::string origValue("0.50");
   value = 0.10 * boost::lexical_cast<double>(origValue);
Run Code Online (Sandbox Code Playgroud)

警告是"溢出的返回值(INTEGER_OVERFLOW)".我无法理解上面的代码有什么问题.当我使用双打时,整数溢出是如何进行的?谢谢.

c++ integer-overflow coverity-prevent

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

使用Callables实现Fibonacci时无声长溢出

我正在尝试使用callables实现Fibonacci序列,并将我的Fibonacci的初始值调用为3,4,5,6和2000.我得到的输出如下:

3 5 8 13 -820905900187520670

问题是当我试图在我的可调用中计算fib(2000)时.有人可以看看下面提供的代码,看看我的方法出错了:

import java.util.concurrent.*;
import java.util.*;

class FibonacciGen implements Callable<Long>{
    private Long fib;
    public FibonacciGen(long num){
        this.fib = num;
    }
    public Long call(){
        return calculateFibonacci(fib);
    }

    private long calculateFibonacci(long someNum){
        long firstNum = 0L;
        long secondNum = 1L;
        long counter = 0L;
        while(counter<someNum){
            long fibCalc = secondNum+firstNum;
            firstNum = secondNum;
            secondNum = fibCalc;
            counter= counter+1L;
        }
        return secondNum;
    }   

}

public class FibonacciCallable{
    public static void main(String[] args){
        ExecutorService exec = Executors.newCachedThreadPool();
        ArrayList<Callable<Long>> results = …
Run Code Online (Sandbox Code Playgroud)

java callable integer-overflow fibonacci long-integer

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

Rails - MySQL自动增量id列类型更改

我有一个有很多模型和数据库表的rails网站.在所有这些中,我想将:id主键列更改为bigint而不是int,因为它将跨越MySQL的整数int(11)限制.

我不想使用他们建议我们做的其他帖子中建议的方法:id => false,同时创建表并添加自定义列:id指定大小.

我已经有很多数据,我不希望id列ids也改变,因为我正在使用它为一些has_many belongs_to关系,并可以打破所有链接.

请建议我如何将int(11)中的change_column id更改为bigint,而无需重新创建表和/或丢失数据和id值

mysql database ruby-on-rails integer-overflow biginteger

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

C++文字整数类型

文字表达式也有类型吗?

long long int a = 2147483647+1 ;
long long int b = 2147483648+1 ; 
std::cout << a << ',' << b ; // -2147483648,2147483649
Run Code Online (Sandbox Code Playgroud)

c++ int integer-overflow long-integer

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

编译器是否有可能检测到整数溢出或其他数据类型溢出的可能性?

是否可以在编译时检测或防止整数溢出而不是在运行时?

如果未检测到溢出并且在运行时发生溢出,是否可以检测到?我在某处读到,如果某个操作出现溢出,处理器将设置一个特定的标志.

如何读取处理器的特定标志?我应该问这是一个单独的问题吗?

编辑:

我的问题是签名和无符号溢出.当我们有一个无符号变量时,它仍然会溢出并将自身设置为0或接近0的东西,对吧?还是我缺少的东西?

c c++ error-handling warnings integer-overflow

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

内置与size_t类型一起使用的正确整数溢出是什么

例如:

size_t x;
...
__builtin_uaddll_overflow(x,1,&x);
Run Code Online (Sandbox Code Playgroud)

无论编译器实现如何,上面的代码都能正确防止整数溢出吗?

到目前为止我所知道的:

  • 此引用声明size_t是无符号类型.
  • 根据这个讨论,typedef unsigned long size_t;可以用来定义size_t.

此参考文献中列出的功能是否始终正确?或者它必然取决于具体实施?如果是这样,我怎么能以编程方式选择正确的函数?

c integer-overflow

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

Integer.MIN_VALUE除以-1

为什么这行代码很重要?(没有它我会得到一个错误的答案)

if (dividend == Integer.MIN_VALUE && divisor == -1) {
    return Integer.MAX_VALUE;
}
Run Code Online (Sandbox Code Playgroud)

问题:

在不使用乘法,除法和mod运算符的情况下除以两个整数.

如果溢出,则返回2147483647

回答

public int divide(int dividend, int divisor) {

    if(divisor == 0){
        return dividend > 0 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
    }

    if(dividend == 0){
        return 0;
    }

    if (dividend == Integer.MIN_VALUE && divisor == -1) {
        return Integer.MAX_VALUE;
    }

    boolean isNeg = (dividend > 0 && divisor < 0) || (dividend < 0 && divisor > 0);


    Long up = Math.abs((long) dividend);
    Long down = …
Run Code Online (Sandbox Code Playgroud)

java integer-overflow

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

了解C中的积分算术

编辑:将void *修改为uint8_t *值。问题仍然存在。编辑:问题是一个简单的变量溢出,与整数提升无关。

我解决了该简化代码中的一个错误。类型与原始源代码中的类型相同。

unsigned int entrySize;    // entrySize is 288
int startIndex, endIndex;  // both are 24536838
uint8_t *pStartAddr;          // valid initialized pointer (0x34f1e40)

/*Mystery begins...*/
uint8_t *curr_addr = pStartAddr + entrySize * startIndex;
while (curr_addr <= startAddr + entrySize * endIndex)
{
    externFunc(curr_addr);
    curr_addr+=entrySize;
}
Run Code Online (Sandbox Code Playgroud)

乍一看,此代码似乎很明显,不包括奇怪的类型选择。

但是,在我们的一次崩溃中,似乎curr_addr获得了无效的指针。我的直觉是存在一个问题,entrySize * startIndex因为它们的乘法设置在第32位,并且具有startIndex和endIndex作为符号类型可能会使编译器使用所需的值感到困惑。

在更改了他们的类型之后,问题就解决了。但我无法弄清楚到底是什么问题。

我正在使用64位计算机,x86_64 CPU,gcc(GCC)4.8.5 20150623和linux red hat发行版(版本4.8.5-28)

我以为上面的计算在的第32位设置时开始出现问题entrySize * startIndex。但是,当我使用第startIndex32位打开的第一个值时,它仍然有效。它也显示

我的问题是:

  • int* 的值结果unsigned int …

c types integer-overflow

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