C言語迷題:符号数と符号数のない問題


先日偶然C言語の問題を収集するサイトを見て、とても興味がありました.私は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
",array[d+1]); return 0; }

とても完璧なコードではないでしょうか.しかし、信じるかどうかにかかわらず、必要な結果は見えません.
問題はforサイクルにおける数字の比較にある.
まず,dはint型であり,符号数があることを示した.それからマクロ定義を見てみましょう.マクロの中でsizeofを使って配列の容量を計算しています.C言語の標準によると、sizeofはsize_を返すべきです.tデータ型、size_tは、以下のタイプに定義される.
typedef unsigned long size_t;

マクロが返す結果が
un
signed long
の各見出しページがあります.
では、この2つのタイプの数字を比較すると、どのような結果になるのでしょうか.
ところで、int型のdは暗黙的にunsigned long型に変換されますので、変換を試してみましょう.
の値は-1で、マシン内の補コードは次のように表示されます.
1111111111111111、すなわち、0 xFFFFFF
そして変換の際、システムは変換の場合に応じて、int型の長さはunsigned long長がないため、int型の数字の高位に応じて拡張し、拡張した結果、dは次のような数字になった.
11111111111111111111111111111、すなわち、0 xFFFFFFFFFF
では、なぜ結果を出力できないのか理解できるでしょう.
最後にまとめてみましょう.一般的に、C言語では暗黙的にデータ型を変換するのは、長さが小さいから長さが大きいへの変換、符号があるから符号がないへの変換、文字型から整形への変換です.プログラミングに少し気をつければ、一般的にはこのような問題は起こらないし、本題では、このようなループの書き方は、出題者がわざとやっただけだろうが、気をつけて対応したほうがいい.
以上は個人的な観点にすぎず、違います.討論を歓迎します.