「一気に最後まで読んだ」本、教えて下さい!

つまらない質問ですみません。
char x,y;

x = 0x01 + 0x00 + 0x04 + 0x03 + 0x02;
   y = ~x;
printf("%x\n", x);
printf("%x\n", y);

これを実行したところ
xにはaと表示されたんですが、yにはfffffff5と表示されました。
なぜ「fffffff5」なんでしょうか?ただの「5」だと思うんですけど。
xは2進数で1010で、yはnot演算子より0101になるので
16進数では5ではないんでしょうか・・・?
変な質問ですみません。
お願いします。。。

A 回答 (3件)

>xは2進数で1010で、yはnot演算子より0101になるので



★1文字は8ビットだから、00001010 だよね。
 それを「not演算」すると・・。

また、
>char x,y;
として宣言しても、

★代入など y = とした時点で y は(32ビットの)「レジスタで作られる」と考えればいいのでは。

また、
>printf( "%x\n", x );

と %x という「フォーマット指定子」を用いた時点で、x は「整数」扱いされたと。

http://www.k-cube.co.jp/wakaba/server/format.html

なお、下のソースの出力をIOリダイレクトでファイルにし、◆部分をバイナリエディタで見ると

0D 0A F5 F5 0D 0A と頭に 0D がついているのは、・・・判りません(残念)。
( %c という「フォーマット指定子」は、F5 F5 と正常(?))

☆頭の 0D は、x が 0x0A で、たまたま改行(LF)コードだから、
 ペアの復帰(CR)コード 0x0D が付加されたのかな(そんなのあり?)。

charx, y;
x = 0x01 + 0x00 + 0x04 + 0x03 + 0x02;
y = ~x;
printf( "%02X,%02X,%02X\n", x, y, (unsigned char)y );
printf( "%c%c%c\n", x, y, (unsigned char)y );// ◆

(「回答」でなく「疑問」になっちゃった、申し訳ない)
    • good
    • 0

まず、「not演算子」というのは ~ ではなく ! です。

<iso646.h>でnotというマクロが ! に定義されます。また、C++ではnotは予約語です。

次に、~x を評価する際には、最初にxが「汎整数拡張(C99では整数拡張)」されます。その結果、xがchar型であってもint型に暗黙的に型変換されるのです。その上で ~ 演算子が適用されます。
使用されている処理系が不明ですが、結果を見る限りではint型は32ビットなのでしょう。上位のビットにも0が詰まっていますから、~ 演算子によってそれらが反転して1になります。
それをchar型の変数yに代入しているのです。これまた厳密には処理系に依存するのですが、char型が符号付きで、かつ負の整数値に1の補数や2の補数を使うのであれば、char型の表現範囲に収まりますので、そのまま代入できます。しかし、符号ビット+絶対値を使う場合には表現範囲を超えるので処理系定義のシグナルが発生するか、処理系定義の値になります。char型が符号無しであれば問題ありません(今回は違うようですが...)。

そして最後に、printfにyを渡しているわけですが、可変個実引数としてchar型の値を渡した場合、「既定の実引数拡張」が起こります。結果としてchar型の値はint型に暗黙的に型変換されます。お使いの処理系ではchar型が符号付きだったのでしょう。符号拡張されたために上位のビットが1になっているのです。
    • good
    • 0

>xは2進数で1010で、yはnot演算子より0101になるので



なぜ1バイトにも満たない2進4桁なんでしょう?最低でも(1バイトでも)11110101(f5)ですよね?で、%xが指定されているので、先行する部分にffが補われているだけだと思います。符号付整数で考えればわかると思いますが・・。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!