我在c++下编程时遇到了一件奇怪的事情。对32bit
个数字
signed
增加
(uint32)(SIN32_MIN * (-1)) //signed integer 4 bytes
给出:
warning C4307: '*' : integral constant overflow
SIN32_MIN
= -2147483648
。
答案 0 :(得分:4)
如果将INT32_MIN
乘以-1
,您将会溢出,因为2147483648无法用带符号的32位整数表示。
如果你想获得-1 *( - 2147483648)= 2147483648
,那么请尝试这样做:(((uint32_t)(INT32_MAX)) + 1)
#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
作为辅助节点,出于类似的原因,通常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