标签: integer-overflow

x86 左移算术溢出控制

您知道有什么方法可以有效地检查 x86 左移算术上是否发生溢出/下溢吗?

x86 assembly integer-overflow bit-shift signed-overflow

3
推荐指数
1
解决办法
1591
查看次数

理解 C++ 中的数值溢出

我试图更好地理解溢出在 C++ 中的行为。考虑以下MWE(必须检查整数文字):

#include <cstdint>
#include <iostream>
#include <iomanip>

int main() {
    uint64_t known    = 6049417284;  // Known solution to operation.
    uint32_t option_1 = 77778u;      // Using 32 bits for operands.
    uint64_t option_2 = 77778ull;    // using 64 bits for operands.

    uint64_t sol_option_1 = option_1*option_1;
    uint64_t sol_option_2 = option_2*option_2;

    std::cout << std::boolalpha << (sol_option_1 == known) << std::endl;
    std::cout                   << (sol_option_2 == known) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

执行:

false
true
Run Code Online (Sandbox Code Playgroud)

为什么它会溢出使用 32 位的操作数,即使我明确要求 64 位来接收解决方案也很困难?

我的印象是,在运行时,C++ 会创建一个临时右值,其精度来自操作数,即 32 位。此溢出,并将此溢出的结果复制到 …

c++ int integer-overflow fixed-width

3
推荐指数
1
解决办法
230
查看次数

如何检查Java中的整数溢出?

整数a=200000;

双 b = (双) (a*a);

我希望能够计算 (a a) (整数)是否已经太大(stackOverflow)而无法保存在变量中;在这种情况下,我知道乘以 (a a) 会导致一个不适合的 int -> 数字将是错误的;

我不明白的是我如何能够从我的头脑中计算出这个。如何查看某个值是否不适合 int 变量?

有没有一种方法可以不使用方法,仅使用纯代码和常识来做到这一点?;-)

此致,

沃特

java double int casting integer-overflow

3
推荐指数
1
解决办法
7808
查看次数

如何解决可能的乘法溢出以获得正确的模运算?

我必须执行(a * b) % m, 但是a, b,和 m是 128 位无符号类型,乘法期间溢出的可能性很大。我怎样才能得到正确的答案(可能使用%更多)?

我正在尝试在 Rust 中实现模指数函数,其中最大的内置类型是u128(这是我可以使用的最大值)。这三个变量都非常大,因此(a * b) > 2^128很容易。我可以用来a.overflowing_mul(b)检测是否发生溢出,但我不知道如何从溢出的结果(可以认为是(a * b) % 2^128)返回得到(a * b) % m。

我的模块化指数代码如下所示(当前未添加溢出支持):

fn mod_exp(b: u128, e: u128, m: u128) {
    (0..e).fold(1, |x, _| (x * b) % m)
    //                    ^^^^^^^^^^^
}
Run Code Online (Sandbox Code Playgroud)

从数学角度来说:

fn mod_exp(b: u128, e: u128, m: u128) {
    (0..e).fold(1, |x, _| (x * b) % …
Run Code Online (Sandbox Code Playgroud)

integer-overflow int128 modulo rust

3
推荐指数
1
解决办法
563
查看次数

C ++中的整数溢出和整数乘法

    int y ;
    y = 7000000000*1.0;
Run Code Online (Sandbox Code Playgroud)

这不会在 cpp 中给出错误

尽管

    int y ;
    y = 7000000000;
Run Code Online (Sandbox Code Playgroud)

这会导致整数溢出

谁能解释一下这两种情况。

c++ floating-point integer integer-overflow multiplication

3
推荐指数
1
解决办法
103
查看次数

为什么通过 Math.pow() 递减 Integer.MIN_VALUE 会返回相同的值?

在执行时:

        int p=-2147483648;
        p-=Math.pow(1,0);  
        System.out.println(p);
        p-=1;
        System.out.println(p);
Output: -2147483648
         2147483647 
Run Code Online (Sandbox Code Playgroud)

那么为什么 Math.pow() 不会溢出数字呢?

java integer-overflow

3
推荐指数
1
解决办法
74
查看次数

尽管使用 Long 原始类型和 Big Integer 的大型斐波那契序列的整数溢出

我正在制作一个程序来打印第 n 个斐波那契数。

方法FIBBO(int n)使用 long 和 BigInteger 类型的组合来存储斐波那契运算的结果。当认为prev+next>Long.MAX_VALUE using big_flag时,该方法假设切换到使用BigInteger。然而,这个程序只有在我在第二个循环中使用 Integer.MAX_VALUE 时才有效。

当我使用 Long.MAX_VALUE 时,无论 n 的值有多大,现在都不会触发 big_flag 的第二个循环,并且我只得到垃圾值。我不明白为什么当我使用 Long.MAX_VALUE 时我的溢出逻辑永远不会被激活。

import java.util.*;
import java.math.*;

public class fibbo_iteration{
    public static void main(String argss[])
    {
        BigInteger result;                      
        Scanner input=new Scanner(System.in);
        int n=0;                                
        System.out.println("Enter number of terms for fibbonacci sequence");
        n=input.nextInt();
        if(n<0){
            System.out.println("Fibbonaci sequence cannot be generated for the entered negative value");
            System.exit(1);
        }
        
        result=fibbo_iteration.FIBBO(n);        //call
        System.out.println(result.toString());  
    }
    static BigInteger FIBBO(int n)
    {
        // variables
        long …
Run Code Online (Sandbox Code Playgroud)

java integer-overflow biginteger bigint long-integer

3
推荐指数
1
解决办法
79
查看次数

(int)(unsigned)-1 == -1 是未定义行为

我试图理解这句话的含义:

(int)(unsigned)-1 == -1;
Run Code Online (Sandbox Code Playgroud)

据我目前的理解,会发生以下事情:

  1. -1是一个有符号的 int并且被转换为无符号的 int。其结果是,由于环绕行为,我们获得了该类型可以表示的最大值unsigned。

  2. 接下来,unsigned我们在步骤 1 中获得的这种类型最大值现在被转换为signed int。但请注意,该最大值是一个unsigned type。所以这超出了的范围signed type。并且由于有符号整数溢出是未定义的行为,因此程序将导致未定义的行为。

我的问题是:

  1. 我上面的解释正确吗?如果不是,那么实际发生了什么。
  2. 这是我怀疑的未定义行为还是实现定义的行为。

PS:我知道如果它是未定义的行为(而不是定义的实现),那么我们不能依赖程序的输出。所以我们不能说我们是否总是会得到true或false。

c++ signed integer-overflow undefined-behavior c++11

3
推荐指数
1
解决办法
546
查看次数

溢出c

我有个疑问

当两个16位值加上最大值时,16位机器会出现溢出吗?

我会详细说明

unsigned short a;
unsigned short b;
unsigned long  c;

c=(unsigned long)(a+b);
Run Code Online (Sandbox Code Playgroud)

谈到16位处理器,累加器将是16位大小.上述声明是否会溢出?请澄清.

c overflow integer-overflow

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

如果我们将一个加到最大的可重现整数,那么结果是否定的?

该程序要求C实现回答一个简单的问题:

如果我们检查最大的可重现整数INT_MAX <0并打印它.

printf ("%d\n", (INT_MAX) < 0);
Run Code Online (Sandbox Code Playgroud)

所以,显示输出0.因为条件变为假,关系运算符返回0.

但是,如果我们添加 1到最大的可重现的整数和检查条件,请参阅以下程序.

#include <limits.h>
#include <stdio.h>

int main (void)
{
  printf ("%d\n", (INT_MAX+1) < 0);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

并显示输出 1.

为什么条件不会变错?

另外,如果我们将一个加到最大的可重现整数,那么结果是否定的?

c operators integer-overflow signed-integer

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