我在很多地方都读到过,无符号整数溢出在C中是定义良好的,不像有符号的对应物。下溢是否相同?例如:
unsigned int x = -1; // Does x == UINT_MAX?
谢谢。我不记得在哪里,但我在某处读到无符号整数类型的算术是模块化的,所以如果是这种情况,那么-1 == UINT_MAX mod(UINT_MAX+1)。
6pp0gazn1#
§6.3.1.3有符号和无符号整数,第2段:如果新类型是无符号的,则通过重复地比新类型中可以表示的最大值加或减一来转换该值,直到该值在新类型的范围内。所以是的,x == UINT_MAX。
x == UINT_MAX
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; }
xe55xuns3#
你混合了有符号和无符号的数字,这很不酷。
unsigned int x = 0u - 1u; // is OK though
3条答案
按热度按时间6pp0gazn1#
§6.3.1.3有符号和无符号整数,第2段:
如果新类型是无符号的,则通过重复地比新类型中可以表示的最大值加或减一来转换该值,直到该值在新类型的范围内。
所以是的,
x == UINT_MAX
。hc8w905p2#
-1,当表示为2的补码数时,等于0xFF... F,表示你的数字有多少位。在无符号数空间中,该值是可能的最大值(即所有位都被设置)。因此,是的,x == UINT_MAX。下面的代码在C99严格编译器上发出“1”:
xe55xuns3#
你混合了有符号和无符号的数字,这很不酷。