C言語関係掲示板

過去ログ

No.179.エラーの意味を教えてください


No.1158

エラーの意味を教えて下さい。
投稿者---キーン(2002/03/04 23:21:28)


現在、独学でC言語を勉強している者(まだ初心者です)ですが、本を読んでいて各型のサイズを調べるプログラムが載っており、それを元に中身をいじくってコードを書いてみたのですがgccでエラーが出てしまいます。エラーの意味を散々調べたのですがわかりませんでした。
詳細は下記の通りです。
どうかお教え下さい。宜しくお願いします。

<コード>
#include <stdio.h>
#include <limits.h>

int main()

{

printf("******************************************\n");
printf(" 現在使用しているCコンパイラの各データ型\n");
printf(" のサイズ及び表現できる範囲を表示します。\n");
printf("******************************************\n\n");

printf("<<<< 符号付き整数型のサイズ >>>>\n\n");
printf("char : %2d バイト\n\n",sizeof(char));
printf("表現できる範囲:%d 〜 %d\n",CHAR_MIN,CHAR_MAX);
printf("short int : %2d バイト\n",sizeof(short int));
printf("表現できる範囲:%d 〜 %d\n",SHRT_MIN,SHRT_MAX);
printf("int : %2d バイト\n",sizeof(int));
printf("表現できる範囲:%d 〜 %d\n",INT_MIN,INT_MAX);
printf("long int : %2d バイト\n",sizeof(long int));
printf("表現できる範囲:%d 〜 %d\n\n",LONG_MIN,LONG_MAX);

printf("<<<< 符号なし整数型のサイズ >>>>\n\n");
printf("unsigned char : %2d バイト\n\n",sizeof(unsigned char));
printf("表現できる範囲:0 〜 %d\n",CHAR_MIN*(-1)+CHAR_MAX);
printf("unsigned short : %2d バイト\n",sizeof(unsigned short));
printf("表現できる範囲:0 〜 %d\n",SHRT_MIN*(-1)+SHRT_MAX);
printf("unsigned int : %2d バイト\n",sizeof(unsigned int));
printf("表現できる範囲:0 〜 %d\n",INT_MIN*(-1)+INT_MAX);
printf("unsigned long : %2d バイト\n",sizeof(unsigned long));
printf("表現できる範囲:0 〜 %d\n\n",LONG_MIN*(-1)+LONG_MAX);

printf("<< 浮動小数点型のサイズ >>\n\n");
printf("float : %2d バイト\n",sizeof(float));
printf("double : %2d バイト\n",sizeof(double));
printf("long double : %2d バイト\n",sizeof(long double));

return 0;
}


<エラーの内容>
size.c: In function `main':
size.c:21: warning: int format, long int arg (arg 2)
size.c:21: warning: int format, long int arg (arg 3)
size.c:29: warning: integer overflow in expression
size.c:31: warning: integer overflow in expression
size.c:31: warning: int format, long int arg (arg 2)


No.1161

Re:エラーの意味を教えて下さい。
投稿者---kikk(2002/03/05 03:20:18)


ども。


><エラーの内容>
>size.c: In function `main':
>size.c:21: warning: int format, long int arg (arg 2)
>size.c:21: warning: int format, long int arg (arg 3)
>size.c:29: warning: integer overflow in expression
>size.c:31: warning: integer overflow in expression
>size.c:31: warning: int format, long int arg (arg 2)

説明の都合上、各警告を上から順にW1〜W5とします。

W1, W2, W5 は、printf()の書式(format)で%d(int)を指定しているのに、
2ないし3番目の引数(arg: argument)がlong intになっているというもの
です。longを出力するのは%ldです。なお、この警告はintとlongの長さが
同じなら無視しても多分正しく動きますが、直しておきましょう(警告は
エラーと同じと思っておいたほうがいいです)。
# LSI Cを使うとこのままでは正しく動かないことを確認するのもよいかと

W3, W4 は整数(integer)の式(expression)がオーバーフローしていると
いっています。それぞれintおよびlong intで計算されていて、それぞれの
最大値にさらに値を足しているので、そういわれるのでしょう。回避法は
ないことはないのですが(unsigned int, unsigned longにキャストする)、
そもそも、このプログラムの符号なし整数の範囲の部分はどの処理系でも
正しく動くとは限りません。

符号なし整数の最大値を表す定数には、UINT_MAXやULONG_MAXといったものが
limits.hで定義されています。間違いは、それらを使うべきというのと、
さらに、このコードでは(警告に対応したとしても)必ずしもそれらの値に
一致しないという点です。符号つきの最大と最小の絶対値が同じ場合は
おそらくUINT_MAX等とは一致しません。いま、手元にある環境で具体的に
いうと、LSI Cは絶対値が同じですし、BCCは違います。LSI CではUINT_MAX等
と一致しないでしょうし、BCCでは一致するでしょう。


ちなみに。
実数関係の諸定数はfloat.hに定義されています。


では。

No.1170

Re:エラーの意味を教えて下さい。
投稿者---キーン(2002/03/05 23:12:27)


ありがとうございます。
参考にしてまた色々作り直してみます。

戻る


「初心者のためのポイント学習C言語」 Last modified:2002.05.14
Copyright(c) 2000-2002 TOMOJI All Rights Reserved