C99标准(第6.3.1.8节)规定:
否则,如果具有无符号整数类型的操作数的等级大于或等于 等于另一个操作数的类型的等级,然后是操作数 有符号整数类型转换为带有unsigned的操作数的类型 整数类型。
但是当我尝试编译这样的代码时(它不是真正的应用程序代码,只是示例)
signed long int x = -1;
unsigned long int y = ULONG_MAX;
if (x < y)
printf("1:%p %p \n", (void *) x, (void *) y);
signed short int xx = -1;
unsigned short int yy = USHRT_MAX;
if (xx < yy)
printf("2:%p %p \n", (void *) (intptr_t) xx, (void *) (intptr_t) yy);
我对具有不同类型的变量有不同的行为。 那是我输出如下:
2:0xffffffff 0xffff
我使用Linux并拥有32位处理器, 编译我使用gcc和clang
gcc -std=c99 -o some \
-pedantic -Wextra -Wall -pedantic-errors \
-Wshadow -Waddress -Wformat \
./some_src.c
clang -std=c99 -o some \
-pedantic -Wextra -Wall -pedantic-errors \
-Wshadow -Waddress -Wformat \
./some_src.c