我已经在许多地方读过,在C语言中,整数溢出很明确,与签名的对应物不同。
下溢是否相同?
例如:
unsigned int x = -1; // Does x == UINT_MAX?
感谢。
我不记得在哪里,但我在某处读到无符号整数类型的算术是模块化的,所以如果是这种情况那么-1 == UINT_MAX mod(UINT_MAX + 1)。
答案 0 :(得分:23)
§6.2.5,第9段:
<击>
涉及无符号的计算
操作数永远不会溢出,因为a
无法表示的结果
得到的无符号整数类型是
减少模数是一个数
大于最大值
可以用结果来表示
类型。击>
修改强>
抱歉,错误的引用,但结果仍然是固定的。正确的引用是§6.3.1.3(有符号和无符号整数转换):
如果新类型是 无符号,值由转换 反复添加或减去一个 超过可以达到的最大值 直到表示新类型 该值在新的范围内 类型。
是的,x == UINT_MAX
。
答案 1 :(得分:4)
-1,当表示为2的补码数时,相当于0xFF ... F,表示您的数字是多少位。在无符号数字空间中,该值是可能的最大值(即,所有位都被设置)。因此,是的,x == UINT_MAX。以下代码在C99严格编译器上发出“1”:
#include <stdio.h>
#include <stdint.h>
#include <limits.h>
int main(int argc, char **argv){
uint32_t x = -1;
printf("%d", x == UINT_MAX ? 1 : 0);
return 0;
}
答案 2 :(得分:-3)
您正在混合有符号和无符号的数字,这是不可靠的。
unsigned int x = 0u - 1u; // is OK though