已登录未签名的转化

4 c

可能重复:
一个谜语(在C中)

看到这段代码

  #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0])) 

  int array[] = {23,34,12,17,204,99,16}; 

  int main() 

  { 

      int d; 

      for(d=-1;d <= TOTAL_ELEMENTS-2;d++) 
          printf("%d\n",array[d+1]); 

      return 0;

  } 
Run Code Online (Sandbox Code Playgroud)

现在这个循环不会运行.sizeof()将返回无符号值,因此TOTAL_ELEMENTS具有无符号值.现在,进入for循环,请告诉我,如果一元运算符' - '在signed int 2上工作或隐式转换发生在unsigned中,然后' - '运算符工作.

f3l*_*lix 8

在您的示例中,d在比较中转换为unsigned int.但-1不能表示为unsigned int值,因此它被转换为UINT_ MAX.要避免此行为,可以通过prepending (int)将比较的右侧转换为signed int.

有关C中整数转换的详细信息,请参阅了解整数转换规则.