关于无符号整数下溢的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 
Interesting Posts