パスワードを忘れた? アカウント作成
452225 journal

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演算子なのかは、とりあえず置いておいて。

さて、結果がどうなったか。

…秘密。(ぉ

とりあえず結果はこの日記に対するコメントのほうに。結果を予測した上で、是非実行してみましょう。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Endows (8644) on 2003年04月19日 8時51分 (#301254) ホームページ 日記

    結果はっぴょ~。

    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 の動作だったのですが…。

    • by Endows (8644) on 2003年04月19日 9時17分 (#301257) ホームページ 日記

      それじゃあってんで演算子を普通の足し算 (+) に変えてみたところ、 Borland C++ Compiler でも全て 4 になった。 LSC C-86 は変わらず全て 1 、 gcc は未調査。ん~、かなり処理系依存?

      親コメント
    • by Endows (8644) on 2003年04月19日 9時58分 (#301263) ホームページ 日記
      個人的に予想していたのは、 Borland C++ Compiler の動作だったのですが…。

      いや、実は & や + が実行される前に両辺が算術変換の規則に従い int 型に変換されるので全部 4 (int型のサイズ) になるのが正解っぽい。

      …っていうか、もともとそうだと思ってたのに、そうじゃないと (間接的に) 言われたから『マジですか!?』と思って調べてみたのだ。そしたらこんな結果になって…。一体何を信用していいのやら。

      ついでだから確認しておきたい。整数の定数 ( 1234 とか 0x80 とか ) を書いたら、それは int 型として認識される、で正しいですよね?

      親コメント
typodupeerror

目玉の数さえ十分あれば、どんなバグも深刻ではない -- Eric Raymond

読み込み中...