您知道有什么方法可以有效地检查 x86 左移算术上是否发生溢出/下溢吗?
我试图更好地理解溢出在 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 位。此溢出,并将此溢出的结果复制到 …
整数a=200000;
双 b = (双) (a*a);
我希望能够计算 (a a) (整数)是否已经太大(stackOverflow)而无法保存在变量中;在这种情况下,我知道乘以 (a a) 会导致一个不适合的 int -> 数字将是错误的;
我不明白的是我如何能够从我的头脑中计算出这个。如何查看某个值是否不适合 int 变量?
有没有一种方法可以不使用方法,仅使用纯代码和常识来做到这一点?;-)
此致,
沃特
我必须执行(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) int y ;
y = 7000000000*1.0;
Run Code Online (Sandbox Code Playgroud)
这不会在 cpp 中给出错误
尽管
int y ;
y = 7000000000;
Run Code Online (Sandbox Code Playgroud)
这会导致整数溢出
谁能解释一下这两种情况。
在执行时:
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() 不会溢出数字呢?
我正在制作一个程序来打印第 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) 我试图理解这句话的含义:
(int)(unsigned)-1 == -1;
Run Code Online (Sandbox Code Playgroud)
据我目前的理解,会发生以下事情:
-1是一个有符号的 int并且被转换为无符号的 int。其结果是,由于环绕行为,我们获得了该类型可以表示的最大值unsigned。
接下来,unsigned我们在步骤 1 中获得的这种类型最大值现在被转换为signed int。但请注意,该最大值是一个unsigned type。所以这超出了的范围signed type。并且由于有符号整数溢出是未定义的行为,因此程序将导致未定义的行为。
我的问题是:
PS:我知道如果它是未定义的行为(而不是定义的实现),那么我们不能依赖程序的输出。所以我们不能说我们是否总是会得到true或false。
我有个疑问
当两个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实现回答一个简单的问题:
如果我们检查最大的可重现整数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.
为什么条件不会变错?
另外,如果我们将一个加到最大的可重现整数,那么结果是否定的?