『'const int' から 'char' へ切り詰めます。』って!?
警告レベルLEVEL4とすると…
以下のようなプログラムで
>char buf[0x100];
>buf[0x01]=0x81;
こんな警告が出る…。
>test.cpp(132) : warning C4305: '=' : 'const int' から 'char' へ切り詰めます。
>test.cpp(132) : warning C4309: '=' : 定数値が切り捨てられました。
これは、一体何を言っているのか!?
でも、
>buf[0x01]=0x41;
では、出ない。
何が違うんだろう?
と思ったら、こう言う事だと気が付いた。
『buf[0x01]=0x81;』で代入したが『buf[0x01]!=0x81』であると。
つまり入力と出力が異なる。
具体的には、こんな感じだろう。
まず入力。
>buf[0x7e]=0x7e;// 10進だと『126』
>buf[0x7f]=0x7f;// 10進だと『127』
>buf[0x80]=0x80;// 10進だと『128』
>buf[0x81]=0x81;// 10進だと『129』
で出力すると…。
>int a
>a=buf[0x7e];// 『a』には、『126』
>a=buf[0x7f];// 『a』には、『127』
>a=buf[0x80];// 『a』には、『-128』
>a=buf[0x81];// 『a』には、『-129』
『char』は、マイナスがあるので同じ値でも
違って扱われてしまう。
>unsigned char buf[0x100];
にすれば、範囲内なのでOK。
コンパイラは、定数入力の時に格納できる型かを
チェックをしているのだね…。
賢過ぎないか?
警告が出過ぎるので嫌がる人も居るけど
できればLEVEL4でコンパイルすると
ポカミスを防げる。
ちなみに
>while( TRUE )
で無限ループを作る人が居るが
>for( ; ; )
の方がお得。
実は、『while』の場合、わざわざ『TRUE』を判定している。
でも『for』 の場合、何もせずに『goto』しているだけ。
しかも、警告も出ないしね♪
つまり警告が出るのは、『何かまずい事をしているに違いない』と
考えて潰して行くと素敵なプログラムになるに違いない!
…
多分、よりバグは少なくなると思うぞ。
ほんの少しだけどね…。(汗)
| 固定リンク
コメント