22

我在很多地方读到无符号整数溢出在 C 中定义明确,与有符号对应物不同。

下溢是否相同?

例如:

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

谢谢。

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

4

3 回答 3

26

§6.2.5,第 9 段:

涉及无符号操作数的计算永远不会溢出,因为无法由结果无符号整数类型表示的结果会以比结果类型可以表示的最大值大一的数字为模减少。

编辑:

对不起,错误的参考,但结果仍然是固定的。正确的参考是§6.3.1.3(有符号和无符号整数转换):

如果新类型是无符号的,则通过重复在新类型中可以表示的最大值加或减一,直到该值在新类型的范围内。

所以是的,x == UINT_MAX

于 2010-05-03T19:22:01.943 回答
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;
}
于 2010-05-03T19:07:52.103 回答
-4

您正在混合有符号和无符号数字,这很不酷。

unsigned int x = 0u - 1u; // is OK though
于 2010-05-03T19:20:08.983 回答