关于无符号整数下溢的C行为的问题

时间:2010-05-03 19:05:19

标签: c integer types integer-overflow underflow

我已经在许多地方读过,在C语言中,整数溢出很明确,与签名的对应物不同。

下溢是否相同?

例如:

unsigned int x = -1; // Does x == UINT_MAX?

感谢。

我不记得在哪里,但我在某处读到无符号整数类型的算术是模块化的,所以如果是这种情况那么-1 == UINT_MAX mod(UINT_MAX + 1)。

3 个答案:

答案 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