« 『日清ラ王』を食べ比べて見た。 | トップページ | 最近の『コマ劇場』を眺めて見た… »

2010年11月18日 (木)

『'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』しているだけ。

しかも、警告も出ないしね♪

つまり警告が出るのは、『何かまずい事をしているに違いない』と
考えて潰して行くと素敵なプログラムになるに違いない!

多分、よりバグは少なくなると思うぞ。

ほんの少しだけどね…。(汗)

|

« 『日清ラ王』を食べ比べて見た。 | トップページ | 最近の『コマ劇場』を眺めて見た… »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: 『'const int' から 'char' へ切り詰めます。』って!?:

« 『日清ラ王』を食べ比べて見た。 | トップページ | 最近の『コマ劇場』を眺めて見た… »