- ベストアンサー
ビット演算について
以下のプログラムを作成して、int型、char型、long型のAND演算・OR演算の結果の違いを見ました。 実行結果からchar型だけ結果の表示の仕方が他と異なっています。 一般的に、バイト数では、 char(1バイト) < short(2バイト) < int(4バイト) のはずなのに、出力結果は、 char(0xffffffff) > short(0xff) = int(0xff) となっていて、charが一番大きく?、shortとintが同じ結果? のようにみえてしまいよくわかりません。 私は、ビット演算が苦手なので、根本的に考え方が間違っているのかも しれませんが、どうしてこのような出力結果となるのか教えてください。 プログラム #include <stdio.h> #include <stdlib.h> int main() { int xi = 0x7F, yi=0x80; int stri1 = xi&yi; int stri2 = xi|yi; printf("** int **\n"); printf("%p\n",stri1); printf("%p\n\n",stri2); char xc = 0x7F, yc=0x80; char strc1 = xc&yc; char strc2 = xc|yc; printf("** char **\n"); printf("%p\n",strc1); printf("%p\n\n",strc2); short xl = 0x7F, yl=0x80; short strl1 = xl&yl; short strl2 = xl|yl; printf("** short **\n"); printf("%p\n",strl1); printf("%p\n\n",strl2); return(0); } 出力結果 ** int ** 0x0 0xff ** char ** 0x0 0xffffffff ** short ** 0x0 0xff
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
※ まだ締め切られていないようなので…… > ** int ** > 0x0 > 0xff ちなみに他の環境だとこんなのが出ます。 ** int ** (nil) 0xff 他の方からも御指摘があったかと思いますが %p はポインタを表示する フォーマットなので 16進数表示は %x です。 printf のフォーマットを調べてみてはいかがでしょうか? > charでは,0xFFFFFFFF = -1 > int では,0xFF = 255 > となるのか分かりません. 他の方も仰られているように処理系が異なると結果も異なるので狭義での 話ですが、short 型のビット演算の場合もこうすれば同じようなことが 発生します。 short xl = 0x7FFF, yl=0x8000; short strl1 = xl & yl; short strl2 = xl | yl; printf("** short **\n"); printf("%x\n", strl1); printf("%x\n\n", strl2); とやってみてください、どうなりますか? 試すとこんな結果になりませんか? ** short ** 0 ffffffff 桁が溢れるのと %x や %p が unsined int 型で表示するからです。 ちなみに特に int 型は処理系で長さが異なります、このような比較例は long としたほうが良いと思います。
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
本論は #1 で終わりなんだけどあえて 1点指摘しておきます: ポインタではないものを %p で出力しようとしている時点で, 何がおこっても不思議じゃないですね.
- jacta
- ベストアンサー率26% (845/3158)
> 一般的に、バイト数では、 > char(1バイト) < short(2バイト) < int(4バイト) 必ずしもそれが一般的なわけではありません。 # そうなることが多いのは確かですが... > 私は、ビット演算が苦手なので、 これはビット演算以前の問題です。 処理系が不明なので正確なことはいえませんが、下記のキーワードについて調べてみるとよいでしょう。 ・負の整数値の内部表現 ・2の補数 ・汎整数拡張(または整数拡張、または汎整数昇格) ・通常の算術型変換
補足
すみません,調べたのですがなぜ charでは,0xFFFFFFFF = -1 int では,0xFF = 255 となるのか分かりません. 補足お願いします。