%x出力変換指定子は変数に格納されている10進数整数値を16進数としてprintf出力表示する 

#include <stdio.h>

int a=15;

int main(void)

{


printf("%x",a);

return 0;

}


コンパイル結果は

f


%x出力変換指定子は変数に格納されている整数値を


16進数でprintf出力表示します。


ここでfは16進数で10進数の15に相当します


アレサ 「16進数では数値は0から順に


0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,10,11,12,13,14,15,16,17,18,19,1a,1b,1c,1d,1e,1f,20・・・


と表現されます。


16進数では


10進数の1をあらわすのに1

10進数の2をあらわすのに2

10進数の3をあらわすのに3

10進数の4をあらわすのに4

10進数の5をあらわすのに5

10進数の6をあらわすのに6

10進数の7をあらわすのに7

10進数の8をあらわすのに8

10進数の9をあらわすのに9

10進数の10をあらわすのにa

10進数の11をあらわすのにb

10進数の12をあらわすのにc

10進数の13をあらわすのにd

10進数の14をあらわすのにe

10進数の15をあらわすのにf

10進数の16をあらわすのに10

10進数の17をあらわすのに11

10進数の18をあらわすのに12

10進数の19をあらわすのに13

10進数の20をあらわすのに14

10進数の21をあらわすのに15

10進数の22をあらわすのに16

10進数の23をあらわすのに17

10進数の24をあらわすのに18

10進数の25をあらわすのに19

10進数の26をあらわすのに1a

10進数の27をあらわすのに1b

10進数の28をあらわすのに1c

10進数の29をあらわすのに1d

10進数の30をあらわすのに1e

10進数の31をあらわすのに1f

10進数の32をあらわすのに20


をもちいています。」


ソーラー 「16進数では数値は0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,fの


🍎16個🍎の数値をもちいてあらわされているわけだ。


となると、


50進数だと数値は🍅50個🍅の数値をもちいて


あらわされるわけかな?


そうなるとアルファベットがたりないや。


そのときは記号?や/\]:;[@^-0,.なんかも使うことになるのかな?」


アレサ 「0000111111・・・


そうですね。そうなると思います。


では


実際に


0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,fの次の数値


10進数16は16進数でどうあらわされるでしょうか?


プログラムを組んで確かめます。


%x出力変換指定子をもちいて


10進数16を16進数であらわしてみます。


#include <stdio.h>

int a=16;

int main(void)

{

printf("%x\n",a);

return 0;

}


コンパイル結果


EAZY IDECの場合

Visual Studioの場合


10


10進数16は16進数では10と表現されています。


16進数f(10進数では15)の次の16進数が10(10進数では16)となるわけですね


ソーラー「10進数と16進数の関係は


10進数であらわすと 16進数10=16となります

10進数であらわすと 16進数100=16の2乗=256となります

10進数であらわすと 16進数1000=16の3乗=4096となります

10進数であらわすと 16進数10000=16の4乗=65536となります

10進数であらわすと 16進数100000=16の5乗=1048576となります

・・・・・

・・・・・

・・・・・

・・・・・

・・・・・

こんな感じ\(^o^)/・・・


つまり

16進数100000・・・(0の数がn個のとき)=10進数 16のn乗の関係


となっています。


ねえ、ねえ じゃ


今のプログラムで🍋10進数-15🍋を%x出力してみたら


どんな16進数がでてくるんだろうか?」


アレサ 「10進数-15を16進数で表示ですか?


マイナス符号は16進数の場合どう表現されるのでしょうか?


考えてもわかりませんが


10進数-15を%x出力変換指定子をもちいて16進数として表示する


プログラムを構成して答えをもとめてみますね。


#include <stdio.h>

int a=-15;

int main(void)

{


printf("%x",a);

return 0;

}


アレサ 「コンパイル........」


つつ~~~~~


コンパイル結果


fffffff1


ソーラー 「コンパイルできてる!」


アレサ 「コンパイル結果は fffffff1」


ソーラー 「以下ソーラーのちょっとあやしい解説(笑)


コンパイル結果から


-15


を16進数に直して表示する%x出力変換指定子を用いて


printf出力表示した結果が


fffffff1となっているのか・・・


う~ん


はたして%x出力変換指定子を用いて


-15を16進数に変換できるのかどうかは分からないけど


このコンパイル結果が正しいとすれば


どうやら16進数 fffffff1は10進数で表すと-15っぽい・・・


もろにf(10新数で15)+ fffffff1を計算してみると


f+ fffffff1=f+( fffffff0+1)=ffffffff+1=100000000


(16進数ffffffffに1を足したものは100000000となります



ffffffff+1=100000000


の部分がわかりにくいですね。



まず


fに1が加えられると10となります


次に


f0に10が加えられると100となります


次に


f00に100が加えられると1000となります


次に


f000に1000が加えられると10000となります


次に


f0000に10000が加えられると100000となります


次に


f00000に100000が加えられると1000000となります


次に


f000000に1000000が加えられると10000000となります


次に


f0000000に10000000が加えられると100000000となるのですね😊



(ここでソーラーは数値をいれかえて遊んでいます。)


となってなってなって>>>


f+ fffffff1=

f(10進数で15)+ fffffff1=100000000となる。


[もしも8桁までしかメモリに数値を格納できないシステム]なら


自分で言うのもなんですが


[カッコ]内の部分があやしいのです。byソーラー


100000000=00000000と9桁目の1が消えて


f(10進数で15)+ fffffff1=00000000となり


16進数00000000は10進数でも0なので


f+ fffffff1=0


f(10進数で15)+ fffffff1=0


15+ fffffff1=0


fffffff1=-15かな、かな?」


アレサ「0000000000000000・・・う^^~ん」


ソーラー 「ぼくがぼけたらつっ込むんだよ~


アレサ。」


アレサ 「は、はい ソーラーさん


0000011111・・・


fffffff1が-15になるかどうかに関しては16進数のまま、


お話をすすめるのではなく


16進数fffffff1を2進数に変換してから


お話をすすめたほうがよいとおもいますの


そうすることによってあやしい[ ]の部分の


解説も正確に行えるとおもいます。


では 再びソーラーさんの解説はじまりますよ。」


は~い、アクション!


ソーラー 「あへふひは~~~~~~」


は~い、カット!


アレサ 「ソーーラーさん・・・」


ソーラー 「読者の視線が僕に釘付けなんだ。


この人生の晴れ舞台において


僕は・・・


僕は・・・


はあ、はあ


あああああ


ぼけないわけにはいかないんだ!」


アレサ 「は、はあ・・・・」


ではでは 再びソーラーさんの解説がはじまりますよ。


は~い、


コンパイル結果


fffffff1


の続きからアクション!


ソーラー 「コンパイルできてる!」


アレサ 「コンパイル結果は fffffff1」


ソーラー 「以下ソーラーのちょっといい解説(笑)


どうやら16進数 fffffff1は10進数で表すと-15っぽい・・・


もろに16進数 f+ fffffff1を計算してみるとしようね。


16進数f+ fffffff1=f+( fffffff0+1)=ffffffff+1=

(ここでソーラーは数値をいれかえて遊んでいます。)


ffffffff+1=

(16進数)f0000000+f000000+f00000+f0000+f000+f00+f0+f+1=


。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

ここでffffffff=f0000000+f000000+f00000+f0000+f000+f00+f0+fとなっています。


この変形どうですか? わかりにくい??


ソーラー かなり遊んでいます。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。


(16進数)

f×10000000+f× 1000000+f×100000+f×10000+f×1000+f×100+f ×10+f+1=



ここで


(16進数)100000・・・(0の数がn個のとき)=(10進数)16のn乗の関係より



(10進数)15×16の7乗+15×16の6乗+15×16の5乗


+15×16の4乗+15×16の3乗+15×16の2乗


+15×16+15+1=


(10進数)15×(2の28乗)+15×(2の24乗)+15×(2の20乗)


+15×(2の16乗)+15×(2の12乗)+15×(2の8乗)


+15×(2の4乗)+15+1=


(10進数)15を(2進数)1111に


(2の28乗)を(2進数)10000000000000000000000000000

(2の24乗)を(2進数)1000000000000000000000000

(2の20乗)を(2進数)100000000000000000000

(2の16乗)を(2進数)10000000000000000

(2の12乗)を(2進数)1000000000000

(2の8乗)を(2進数) 100000000

(2の4乗)を(2進数) 1000

変換すると


(2進数)1111×10000000000000000000000000000

+1111×1000000000000000000000000

+1111×100000000000000000000

+1111×10000000000000000

+1111×1000000000000

+1111×100000000

+11110000

+1111

+1

=(2進数)11110000000000000000000000000000

+1111000000000000000000000000

+111100000000000000000000

+11110000000000000000

+1111000000000000

+111100000000

+11110000

+1111

+1

=(2進数)11111111111111111111111111111111

+1

=(2進数)100000000000000000000000000000000


となって>>>

結局

f+ fffffff1=

f(10進数で15)+ fffffff1=

(2進数)1000000000000000000000000000000000000(33桁)となる。


int型は32桁までしか数値を格納できないシステムなので


100000000000000000000000000000000

=00000000000000000000000000000000(32桁)と33桁目の1が消えて


f(10進数で15)+ fffffff1=2進数00000000000000000000000000000000となり


2進数00000000000000000000000000000000は10進数でも0なので


f(10進数で15)+ fffffff1=10進数0


15+ fffffff1=0


fffffff1=-15かな、かな?」


アレサ「うわっすごい。ソーラーさん、すごい」


ソーラー 「やっぱり、int型なので32ビット=8バイトに


おさまっているね(^^)」


アレサ 「きれいにおさまりましたね。」



  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます