关于无符号整数下溢的C行为的问题
我已经读了很多地方,整数溢出是定义在C中不同于签名的对手。
下stream是否一样?
例如:
unsigned int x = -1; // Does x == UINT_MAX?
谢谢。
我不记得在哪里,但我读的地方,无符号整数types的算术是模块化的,所以如果是这样的话-1 -1 UINT_MAX mod(UINT_MAX + 1)。
第6.2.5节第9段:
涉及无符号操作数的计算永远不会溢出,因为无法用结果的无符号整数types表示的结果被减less的模数大于可以由结果types表示的最大值的数。
编辑:
对不起,错误的引用,但结果仍然是固定的。 正确的引用是§6.3.1.3(有符号和无符号整数转换):
如果新types是无符号的,则通过重复加或减一个比新types中可以表示的最大值更多的值来转换该值,直到该值在新types的范围内。
所以是的, x == UINT_MAX
。
-1表示为2的补码数,相当于0xFF … F表示数字的多less位。 在一个无符号的数字空间中,该值是可能的最大值(即所有的位被设置)。 因此是的,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; }
你正在混合有符号和无符号的数字,这是不酷的。
unsigned int x = 0u - 1u; // is OK though