自动类型转换

Zoo*_*mIn 1 c

可能重复:
签名到无符号转换
一个谜语(在C中)

我试图理解为什么这个程序不起作用

 #include<stdio.h>

  #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)

当我在C.中进行自动类型转换时,我遇到了这个程序.但我不明白有符号和无符号数据类型之间的转换是如何发生的.请解释一下.谢谢,哈里什

ami*_*mit 7

sizeof()是无符号类型,Wile d是签名.

你检查是否d小于无符号整数.因此,签名d转换为unsinged.

但是-1当读取为无符号时,有符号表示符号的大小大于2 ^ 31,并且明显大于那么TOTAL_ELEMENTS-2,因此条件永远不会满足,并且您甚至不会进入for循环一次.

看看这个代码快照,它可能会为你清理一些事情:

#include <stdio.h>
#include <stdlib.h>
int main() { 
   unsigned int x = 50;
   int y = -1;
   printf("x < y is actually %u < %u which yields %u\n", y,x,y < x);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码打印:

x <y实际上是4294967295 <50,产生0