当我比较不同等级的值时,我对c行为感到困惑

时间:2015-04-03 15:32:48

标签: c gcc clang c99

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

0 个答案:

没有答案