标签: integer-overflow

java算术

为什么这段代码返回错误的值?

int i=Integer.MAX_VALUE+1;
long l=Integer.MAX_VALUE+1;
System.out.println(l);
System.out.println(i);
Run Code Online (Sandbox Code Playgroud)

java math integer-overflow

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

需要帮助理解整数运算功能

请有人亲切地为我解释这个功能谢谢!

int overflow(int x, int y)
{
   int result, non_overflow, overflow, result_sign, mask;

   result = x + y;
   result_sign = result >> 31;  //Need help starting from here... I know
                                //it is shifting 31 bits... but why??
   non_overflow = ((x ^ y) | ~(y ^ result)) >> 31;
   overflow = ~non_overflow;

   mask = overflow << 31;

   return (non_overflow & result) | (overflow & (result_sign ^ mask));  
}
Run Code Online (Sandbox Code Playgroud)

c 32-bit integer-overflow integer-arithmetic

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

"int64var = int32var*int32var"中的计算不会按预期溢出.为什么?

我坚信有一些奇怪的事情发生,所以我想提出这个问题.

#include <time.h>
#include <stdint.h>

// shall return a monotonically increasing time in microseconds
int64_t getMonotonicTime() {
   struct timespec ts;
   clock_gettime(CLOCK_MONOTONIC, &ts);

   int64_t ret;
   ret = ts.tv_sec * 1000000; // #1 HERE
   ret += ts.tv_nsec / 1000;
   return ret;
}
Run Code Online (Sandbox Code Playgroud)

有问题的行ts.tv_sec * 1000000导致系统溢出,其中time_t和int32位大(在我的系统上恰好是这种情况),每次ts.tv_sec大于2 147.

当我为这个bug编写测试用例时,我发现英特尔icc编译器没有溢出,即使我确信它time_t实际上也32有点宽,即使我禁用了优化.GCC行为确实导致了预期的溢出.

除了未定义的行为,英特尔不会溢出的原因是什么?英特尔开发人员的理由是什么?或者这只是我的误解?

gcc posix clock integer-overflow icc

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

在溢出的情况下,变量的值总是为负

它试图解决这个问题,因为N,K amd M,找到最大的整数T这样N*(K^T) <= M.N,K and M可以是值的10^18.这样long long就足够了.我尝试使用T上的迭代来解决它

int T = 0;
long long Kpow = 1;
while(1)
{
  long long prod = N*Kpow;
  if(prod > M)
    break;
  T++;
  Kpow = Kpow*K;
}
Run Code Online (Sandbox Code Playgroud)

但由于N*Kpow可能超出范围long long,因此需要使用一些大整数来处理产品.但我发现了一些巧妙处理这种情况的其他代码

long long prod = N*Kpow;
if(prod < 0)
  break;
Run Code Online (Sandbox Code Playgroud)

即使我总是看到,在溢出时,变量的值变为负值.总是如此,有时甚至在溢出情况下也会出现正值?

c c++ integer-overflow

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

C整数关闭,可能溢出

我正在尝试制作一个C程序,用于计算和打印用户输入的制表符,空格和行数.问题在于,当它打印出这些数字时,它们就会大放异彩.这是我的程序代码:

int c, b, t, nl;
b, t, nl = 0, 0, 0;
while ((c = getchar()) != EOF) 
{
    if (c == '\b') 
        b++;
    if (c == '\t') 
        t++;
    if (c == '\n') 
        nl++;
}
printf("b=%d t=%d nl=%d\n", b, t, nl);
Run Code Online (Sandbox Code Playgroud)

当我从终端输入一些数据时(3行,一个空格,一个标签),结果是b = 1899313536,t = 32768,并且nl = 3.

c integer integer-overflow

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

Golang:on-purpose int overflow

我正在使用哈希函数murmur2返回给我一个uint64.

我想将它存储在PostgreSQL中,它只支持BIGINT(带符号64位).

因为我对数字本身不感兴趣,只是对二进制值感兴趣(因为我将它用作检测唯一性的id(我的值为~1000值,64位散列对我来说足够了)我想int64通过"只是"改变类型将其转换为.

如何以一种令编译器满意的方式做到这一点?

integer-overflow type-conversion go

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

如何定义已检查整数的列表

我有一个定义的整数列表List<int> myIntList = new List<int>();像往常一样我将使用myIntList.Add()方法向列表添加值 .我面临的问题是列表中的值是动态的(一些计算的结果),可能超过整数可以容纳的最大值.

请考虑以下情形:

 int x = int.MaxValue;
 myIntList.Add(x + 1); 
Run Code Online (Sandbox Code Playgroud)

这将添加-2147483648到列表而不是抛出异常.我需要在这里抛出异常.我知道myIntList.Add(checked(x + 1));会完美地完成这项工作,或者我甚至可以将myIntList.Add()包含在内checked{},如下所示:

 checked
     {
         myIntList.Add(12);
         myIntList.Add(int.MaxValue);
         myIntList.Add(x + 1);
     }
Run Code Online (Sandbox Code Playgroud)

这是我的问题这有什么替代方案吗?我可以定义已检查整数的列表吗?如何在列表中添加的值超出限制的情况下创建引发异常的列表?

更新:

谢谢大家的回复,大多数人建议在将它们添加到列表之前检查整数(如果它超出边界则抛出异常).这与我通过给定的片段所做的相同checked{// add elements },它将抛出异常而不需要任何复杂的条件检查.

c# exception list integer-overflow

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

为什么1024*1024*1024*2!= 1024*1024*1024*2

在开始时,我写了一个演示来获得2G内存,但我遇到了这样的问题,我不知道为什么,num1,num2,num3有什么不同?

#include<stdio.h>
int main(){
    unsigned long num1 = 1024*1024*1024*2;
    unsigned long num2 = 1024*1024*1024*2.0;
    unsigned long num3 = 1024*1024*1024;
    num3 *= 2;
    printf("num1:%lu\n num2:%lu\n num3:%lu\n", num1, num2, num3);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

num1:18446744071562067968
num2:2147483648
num3:2147483648
Run Code Online (Sandbox Code Playgroud)

c integer-overflow

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

寄存器AL和AX溢出到哪里?

请告诉我以下汇编(伪)代码的结果是什么?
我们已经设置寄存器的所有位EAX为0,这样反过来我们也有AH,AL和AX为0。但是,当我减去最低位AL,我们将采取补和补充,给我们一堆1秒,随后一0。

XOR eax, eax
SUB al 0x01
Run Code Online (Sandbox Code Playgroud)

因此,总而言之,我的问题是在执行上述代码时,将仅AL充满1,或者也将延续到AX和EAX。

x86 assembly integer-overflow cpu-registers ctf

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

如何在C ++中处理最大为2 ^ 9000000的整数

我知道的最大正整数数据类型是unsigned long long。有没有办法在C ++中处理2 ^ 9000000的整数。我在代码块中使用了gcc编译器,但也可以在Visual Studio上工作。

c++ integer-overflow unsigned-long-long-int

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