标签: integer-overflow

故意价值溢出安全吗?

这个问题可能是愚蠢或偏执的,但无论如何:-).给出以下代码:

DWORD hiRes;

// will overflow about once in an hour
hiRes = GetTickCount() * 1193L;
Run Code Online (Sandbox Code Playgroud)

如果知道hiRes周期性溢出并且这种情况得到妥善处理,那么这段代码有什么问题吗?

更新: 结果对我来说非常令人惊讶,因为答案取决于hiRes(有符号或无符号)的类型,它由C标准定义(参见例如).

c windows integer-overflow

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

INT_MIN/-1是否在C++中定义了行为?

我有以下代码INT_MIN/-1.我希望这可能是INT_MAX + 1(或翻转时为0).但是,我得到的实际结果是INT_MIN.这是我的测试代码:

#define __STDC_LIMIT_MACROS
#include <stdint.h>
#include <stdio.h>
#include <limits.h>
using namespace std;
int main()
{
  int min=INT_MIN;
  int res=min/-1;
  printf("result: %i\n", res);
  printf("max: %i min: %i\n", INT_MAX, INT_MIN);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

此实现是特定的和/或未定义的行为吗?

c++ math integer-overflow integer-division

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

为什么gcc在一种情况下警告"假设已签名溢出",而在另一种情况下则不然

请考虑以下代码:

$ cat o.c 
#include <stdio.h>
#include <limits.h>

int absolute(int i) {
  int j = i < 0 ? -i : i;
  if (j<0)      /* This is line 6 */
    return 0;
  return j;
}

int main() {
  int i = 1;
  printf("%d %d\n", i, absolute(i));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

用它编译-O2并-Wstrict-overflow产生警告:

$ gcc -O2 -Wall -Wextra -Wstrict-overflow o.c 
o.c: In function ‘absolute’:
o.c:6:6: warning: assuming signed overflow does not occur when simplifying comparison of absolute value and …
Run Code Online (Sandbox Code Playgroud)

c gcc integer-overflow compiler-warnings

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

为什么<< 32在javascript中不会导致0?

这是假的:

(0xffffffff << 31 << 1) === (0xffffffff << 32)
Run Code Online (Sandbox Code Playgroud)

看起来应该是真的.添加>>> 0任何地方都不会改变这一点

为什么这样,我怎样才能正确编写处理的代码<< 32?

javascript unsigned bit-manipulation integer-overflow bit-shift

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

十进制到分数

我正在研究一个需要接受和显示复杂分数的系统.接受分数并将它们转换为double作品的代码,但是当我想显示该值时,我需要转换回小数表示.

编辑:我已经修复了溢出问题,但是没有解决像1/3或5/6这样的分数.所以我设计了一种非常黑客的方法来做到这一点.我有代码生成1-> 64的每个分数0-> 64的十进制表示,并保存最简化的形式.这样,我可以遍历列表并找到最接近的分数,并简单地显示它.我有一些后会发布代码.

我现在的代码适用于绝大多数数字,但偶尔我会得到一小部分数字1/321.这会转换为double,但不能转换回来,因为在我的方法中,分子会导致整数溢出.

这是我的代码,我想知道是否有更好的方法,或者是否有一些方法可以安全地将这些转换为long而不会失去正确结果所需的精度:

public static String DecimalToFraction(double dec)
    {
        string str = dec.ToString();
        if (str.Contains('.'))
        {
            String[] parts = str.Split('.');
            long whole = long.Parse(parts[0]);
            long numerator = long.Parse(parts[1]);
            long denominator = (long)Math.Pow(10, parts[1].Length);
            long divisor = GCD(numerator, denominator);
            long num = numerator / divisor;
            long den = denominator / divisor;

            String fraction = num + "/" + den;
            if (whole > 0)
            {
                return whole + " " + fraction;
            }
            else
            { …
Run Code Online (Sandbox Code Playgroud)

c# math integer-overflow

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

golang常量溢出uint64有什么问题

userid := 12345
did := (userid & ^(0xFFFF << 48))
Run Code Online (Sandbox Code Playgroud)

在编译这段代码时,我得到了:

./xxxx.go:511: constant -18446462598732840961 overflows int

你知道这件事有什么关系吗?如何解决?谢谢.

integer-overflow go

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

预期溢出但添加两个字节不会

更新

任何人都可以解释为促进理由uint8_t来int?这种行为有什么用例?我可以阻止推广吗?


我有这些非常简单的代码片段,它们将两个整数类型组合在一起并打印结果.我编译了那些没有任何优化的g++ --std=c++11 main.cpp -o test

int main()
{
    uint8_t a = 200, b = 100;
    uint16_t result = (a + b);

    printf("result is %d\n", result);
}
Run Code Online (Sandbox Code Playgroud)

输出:

结果是300

我本来期望(a + b)评估,44因为它们都是8位类型,应该溢出.但相反,我得到了意想不到的结果300.


如果我用uint32_t和重新运行相同的测试uint64_t,它会溢出预期:

int main()
{
    uint32_t a = UINT_MAX, b = UINT_MAX;
    uint64_t result = (a + b);

    printf("result is %ld\n", result);
}
Run Code Online (Sandbox Code Playgroud)

输出:

结果是4294967294

现在我不知道为什么uint8_t被区别对待uint32_t.

c++ integer-overflow

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

C++中数学计算中的内部时间变量

以下示例用于说明我的问题:

#include <iostream>
#include <string>

int main()
{

  signed char p;
  signed char temp=100;
  signed char t=4;
  p = (temp+temp+temp+temp)/t;
  std::cout << "Hello, " << int(p)<< "!\n";
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,变量p被定义为四个singed char变量的平均值.但是,signed char变量(temp + temp + temp + temp)的总和将大于signed char的范围.所以我的问题是C++如何处理这种情况.

c++ casting integer-overflow

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

INT_MIN*-1是x86上的无操作吗?

有符号整数在x86上通过二进制补码表示,其中符号位具有该值-(2^N).这导致在-2^N和2^N - 1(例如-32768通过32767)之间的典型可表示值范围.

我很好奇如果我在我的系统上取最小有符号整数值并乘以它以-1试图"强制"一个大于我系统上有符号整数的最大可表示值的最大值,会发生什么.

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

int main(void){
    signed int x, y;

    x = INT_MIN;
    y = x * -1;

    printf("%d\n%d\n", x, y);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这导致以下输出:

# gcc -std=c89 -pedantic int_min_test.c

# ./a.out
-2147483648
-2147483648
Run Code Online (Sandbox Code Playgroud)

我期待一个整数溢出(导致典型的值翻转),但看起来似乎没有关于xwith 的乘法操作-1.

在x86中是否INT_MIN与-1no-op 相乘?

x86 signed integer-overflow undefined-behavior

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

当分配1时,这个大小为1的位字段实际上是溢出的吗?

我已经编写了一些代码字段的代码,我认为应该可行,但看起来像GCC不同意.我是否错过了某些内容或者我是否真的在GCC中发现了一个错误?

简化我的代码后,测试用例非常简单.我将整数文字分配给1一个大小为一位的位域:

typedef struct bitfield
{
    int bit : 1;
} bitfield;

bitfield test()
{
    bitfield field = {1};
    return field;
}
Run Code Online (Sandbox Code Playgroud)

如果我使用GCC 6.2.1(与5.4.0相同)编译它,我会收到以下警告(使用-pedantic):

gcc -fPIC test.c -pedantic -shared
test.c: In function ‘test’:
test.c:8:23: warning: overflow in implicit constant conversion [-Woverflow]
     bitfield field = {1};
                       ^
Run Code Online (Sandbox Code Playgroud)

奇怪的是:当我用-Woverflow替换-pedantic时,警告消失了.

我没有得到任何警告警告.

c gcc integer-overflow compiler-warnings

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