2012-01-24 16 views
1

可能性の重複:
signed to unsigned conversions
A riddle (in 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; 
    } 

が動作していない理由を理解しようとしています私がthrに行くときC.Butでough自動型変換私は、変換が説明types.Please符号付きと符号なしのデータの間で起こるかわかりません。 は、ありがとう、誘い込むdが署名されている ハリッシュ

+0

私はこの質問が以前に尋ねられたのか分かりませんでした。私は暗黙の変換を理解しようとしていました。 – ZoomIn

答えて

7

sizeof()符号なしの型です。

dが符号なし整数より小さいかどうかをチェックします。したがって、符号付きdはunsingedに変換されます。

しかし、符号なしのビット表現は、符号なしとして読み取ると2^31より大きく、明らかにTOTAL_ELEMENTS-2より大きいため、条件は決して満たされず、forループを1度でも入力しません。

このcode snapを見て、それはあなたのために物事をクリアすることがあります

#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; 
} 

上記のコードを印刷します。x <

yは0

を得た実際4294967295 < 50です
+0

ありがとう、私はそれを得た。 – ZoomIn