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

xzabzqsa  于 2023-03-28  发布在  其他
关注(0)|答案(3)|浏览(170)

我在很多地方都读到过,无符号整数溢出在C中是定义良好的,不像有符号的对应物。
下溢是否相同?
例如:

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

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

6pp0gazn

6pp0gazn1#

§6.3.1.3有符号和无符号整数,第2段:
如果新类型是无符号的,则通过重复地比新类型中可以表示的最大值加或减一来转换该值,直到该值在新类型的范围内。
所以是的,x == UINT_MAX

hc8w905p

hc8w905p2#

-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;
}
xe55xuns

xe55xuns3#

你混合了有符号和无符号的数字,这很不酷。

unsigned int x = 0u - 1u; // is OK though

相关问题