警告C4307:'*':积分常数溢出

时间:2017-05-05 08:50:13

标签: c++

我在下编程时遇到了一件奇怪的事情。对32bit个数字

进行signed增加
(uint32)(SIN32_MIN * (-1)) //signed integer 4 bytes

给出:

warning C4307: '*' : integral constant overflow

SIN32_MIN = -2147483648

3 个答案:

答案 0 :(得分:4)

如果将INT32_MIN乘以-1,您将会溢出,因为2147483648无法用带符号的32位整数表示。

如果你想获得-1 *( - 2147483648)= 2147483648,那么请尝试这样做:(((uint32_t)(INT32_MAX)) + 1)

Sample code

#include <stdint.h>
#include <stdio.h>

int main()
{
    uint32_t n = static_cast<uint32_t>(INT32_MAX)+1;
    printf("n: %u\n", n);
}

输出:

n: 2147483648

这会产生no warnings with clang

作为辅助节点,出于类似的原因,通常INT32_MIN不被定义为#define INT32_MIN -2147483648。它通常被定义为(-2147483647 - 1)或类似的东西。

您也可以do this instead(uint32_t)(INT32_MIN * -1LL)

答案 1 :(得分:3)

在整数为2's complement(几乎是任何现代通用计算机)的环境中,可以用固定位数表示的数字范围不对称为0.在32位数字中,可以表示的最大正数是2147483647,它是二进制

0111 1111 1111 1111 1111 1111 1111 1111

数字-2147483648 * -1是2147483648,与2147483647 + 1相同,但是当我们加1时,位模式是

1000 0000 0000 0000 0000 0000 0000 0000

设置最高位,这意味着它是负数的表示。实际上它是-2147483648。 +2147483648无法用32位表示。

答案 2 :(得分:2)

公式for k, v in bag.items(): print(v, k) 结果为SIN32_MIN * (-1),超出2147483648范围:

signed int32