Endowsの日記: Endows の へっぽこプログラマ日誌 第7回 3
日記 by
Endows
第6回、第6.1回で sizeof の動作についてさんざん頭を悩ませていたが、なぜそんなことをしようと思ったかといえば、算術変換 (K&R 第2版日本語版 241ページ参照)の規則、特に char 型同士の場合について詳しく知りたかったためだ。実は関数の sizeof は脇道だったのだ。
んで、こんなソースを書いてみた。 (主要な部分のみ抜粋、足りないところは各自補完してください)
signed char sc1, sc2;
unsigned char uc1, uc2;
char c1,c2;
printf(" sizeof(sc1&sc2) : %d\n" , sizeof(sc1&sc2));
printf(" sizeof(uc1&uc2) : %d\n" , sizeof(uc1&uc2));
printf(" sizeof( c1& c2) : %d\n" , sizeof( c1& c2));
printf(" sizeof(sc1&uc2) : %d\n" , sizeof(sc1&uc2));
printf(" sizeof(sc1& c2) : %d\n" , sizeof(sc1& c2));
printf(" sizeof( c1&uc2) : %d\n" , sizeof( c1&uc2));
なぜよりによってビットAND演算子なのかは、とりあえず置いておいて。
さて、結果がどうなったか。
…秘密。(ぉ
とりあえず結果はこの日記に対するコメントのほうに。結果を予測した上で、是非実行してみましょう。
結果 (スコア:1)
結果はっぴょ~。
Borland C++ Compiler 5.5.1 (Win98SE) の場合
sizeof(sc1&sc2) : 1
sizeof(uc1&uc2) : 1
sizeof( c1& c2) : 1
sizeof(sc1&uc2) : 4
sizeof(sc1& c2) : 1
sizeof( c1&uc2) : 4
LSI C-86 Ver. 3.30c試食版 (Win98SE) の場合
sizeof(sc1&sc2) : 1
sizeof(uc1&uc2) : 1
sizeof( c1& c2) : 1
sizeof(sc1&uc2) : 1
sizeof(sc1& c2) : 1
sizeof( c1&uc2) : 1
gcc 2.95.3 (VineLinux) の場合
sizeof(sc1&sc2) : 4
sizeof(uc1&uc2) : 4
sizeof( c1& c2) : 4
sizeof(sc1&uc2) : 4
sizeof(sc1& c2) : 4
sizeof( c1&uc2) : 4
…処理系によって変わってしまった (汗
個人的に予想していたのは、 Borland C++ Compiler の動作だったのですが…。
Re:結果 (スコア:1)
それじゃあってんで演算子を普通の足し算 (+) に変えてみたところ、 Borland C++ Compiler でも全て 4 になった。 LSC C-86 は変わらず全て 1 、 gcc は未調査。ん~、かなり処理系依存?
Re:結果 (スコア:1)
いや、実は & や + が実行される前に両辺が算術変換の規則に従い int 型に変換されるので全部 4 (int型のサイズ) になるのが正解っぽい。
…っていうか、もともとそうだと思ってたのに、そうじゃないと (間接的に) 言われたから『マジですか!?』と思って調べてみたのだ。そしたらこんな結果になって…。一体何を信用していいのやら。
ついでだから確認しておきたい。整数の定数 ( 1234 とか 0x80 とか ) を書いたら、それは int 型として認識される、で正しいですよね?