2

C でさまざまな変数型の最大値とサイズを表示する単純な C コードを作成しようとしています。しかし、一部の変数型に対して sizeof() 演算子が -1 を返すなど、奇妙な出力が得られます。以下のコードで「%e」を「%d」に変更すると、変更しなかった指定子でも非常に異なる出力が得られるため、問題は printf コマンドで使用している指定子にあると思います。私の質問は、私が探している適切な出力、つまり最初の列の変数型の最大値と 2 番目の列の変数型のサイズを取得する方法です。

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>

int main()
{  

  printf("Float max:   %e    Nbytes:  %d\n",FLT_MAX,sizeof(float));
  printf("Double max:  %e    Nbytes:  %d\n",DBL_MAX,sizeof(double));
  printf("Int max:     %e    Nbytes:  %d\n",INT_MAX,sizeof(int));
  printf("UnInt max:   %e    Nbytes:  %d\n",UINT_MAX,sizeof(unsigned int));
  printf("LongIntmax:  %e    Nbytes:  %d\n",LONG_MAX,sizeof(long));
  printf("UnLong max:  %e    Nbytes:  %d\n",ULONG_MAX,sizeof(unsigned long));
  printf("Longlongmax: %e    Nbytes:  %d\n",LLONG_MAX,sizeof(long long));


  exit(0);
}

書かれたコードから得られる出力は次のとおりです。

Float max:   3.402823e+38    Nbytes:  4       
Double max:  1.797693e+308    Nbytes:  8    
Int max:     1.797693e+308    Nbytes:  2147483647    
UnInt max:   1.797693e+308    Nbytes:  -1    
LongIntmax:  1.797693e+308    Nbytes:  -1    
UnLong max:  1.797693e+308    Nbytes:  -1    
Longlongmax: 1.797693e+308    Nbytes:  -1    

ただし、すべての '%e' を '%d' に切り替えてコードを再度実行すると、次のようになります。

Float max:   4    Nbytes:  -1290994504    
Double max:  8    Nbytes:  605613584    
Int max:     2147483647    Nbytes:  4    
UnInt max:   -1    Nbytes:  4    
LongIntmax:  -1    Nbytes:  8    
UnLong max:  -1    Nbytes:  8    
Longlongmax: -1    Nbytes:  8    

最初の実行の 2 番目の列の出力は、2 番目の実行の最初の列の出力になります。ここで何が起こっているのかわかりません。繰り返しますが、間違った指定子を *_MAX 定数に関連付けていると思いますが、見落としている別の問題があるかどうかはわかりません。

4

1 に答える 1

3

はい、問題は指定子にあります-署名付き、未署名用の%f/ %e/ (および昇格される)の引数に一致する必要があります。そして、それぞれの真ん中に。最後に必要です。%gdoublefloat%d%ullongsize_t%zu

  printf("Float max:   %f    Nbytes:  %zu\n",FLT_MAX,sizeof(float));
  printf("Double max:  %f    Nbytes:  %zu\n",DBL_MAX,sizeof(double));
  printf("Int max:     %d    Nbytes:  %zu\n",INT_MAX,sizeof(int));
  printf("UnInt max:   %u    Nbytes:  %zu\n",UINT_MAX,sizeof(unsigned int));
  printf("LongIntmax:  %ld    Nbytes:  %zu\n",LONG_MAX,sizeof(long));
  printf("UnLong max:  %lu    Nbytes:  %zu\n",ULONG_MAX,sizeof(unsigned long));
  printf("Longlongmax: %lld    Nbytes:  %zu\n",LLONG_MAX,sizeof(long long));

-1フォーマット文字列が引数と一致しない場合、未定義の動作をトリガーするためです。

于 2013-06-05T20:30:25.150 に答える