つまらない質問ですみません。
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件)
- 最新から表示
- 回答順に表示
No.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 );// ◆
(「回答」でなく「疑問」になっちゃった、申し訳ない)
No.2
- 回答日時:
まず、「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になっているのです。
No.1
- 回答日時:
>xは2進数で1010で、yはnot演算子より0101になるので
なぜ1バイトにも満たない2進4桁なんでしょう?最低でも(1バイトでも)11110101(f5)ですよね?で、%xが指定されているので、先行する部分にffが補われているだけだと思います。符号付整数で考えればわかると思いますが・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
Windows Formアプリからコンソ...
-
パソコン
-
10進数からN進数に変換するプロ...
-
今ってプログラミング言語は何...
-
ArduinoのジャイロモジュールMP...
-
c言語でイベントフラグを使った...
-
ArduinoでMouse関数を使用して...
-
c言語
-
だれがとけるの?
-
Cのコンパイルでコメントアウト...
-
visual studioでフォームデザイ...
-
const char** p;のとき、free(p...
-
C++でデスクトップGUIアプリ開...
-
ストリームについて。
-
いまc言語の標準ライブラリ文字...
-
C言語 1から20までの逆数の和を...
-
C# DatagridviewにExcelシート...
-
逆コンパイルと逆アセンブルの...
-
C言語です
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
どうして+3
-
プログラミング言語についてc++...
-
今ってプログラミング言語は何...
-
2つほどお聞きしたいことがあり...
-
次の記述について
-
パソコン
-
バッチファイルで以下のような...
-
大量のデータを読み込んで表示...
-
c言語
-
Windows Formアプリからコンソ...
-
gccを行ってもexeファイルが生...
-
VisualStudio2022でC言語プログ...
-
UART通信の取説で,left floati...
-
C#でTreeViewのCheckBoxのサイ...
-
10進数からN進数に変換するプロ...
-
Python、プログラミングについ...
-
[C言語]fputsとfprintfの違い
-
0 == False はいいけど
-
VisualStudioで、コードを印刷...
-
逆コンパイルと逆アセンブルの...
おすすめ情報