%x出力変換指定子は変数に格納された10進数整数値データを16進数数値データに変換してprintf出力表示する際に用いられます

%x出力変換指定子は変数に格納された10進数整数値データを16進数数値データに変換してprintf出力表示する際に用いられます




#include <stdio.h>

int a=15;

int main(void)

{


printf("%x",a);

return 0;

}


プログラムの実行結果は

f


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


16進数でprintf出力表示する際に用いられます。


このプログラムでは


int型の変数aに10進数数値データ15を代入した後


printf("%x",a);


を実行することにより


10進数数値データ15



16進数fに切り替えてコマンドプロンプト画面に表示しています



ここで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進数で表示ですか?


マイナス符号がついた10進数(-15)



16進数の場合では どう表現されるのでしょうか?


考えてもわかりませんが


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


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

👇

#include <stdio.h>

int a=-15;

int main(void)

{


printf("%x",a);

return 0;

}


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


つつ~~~~~


プログラムの実行結果


fffffff1


ソーラー 「プログラムを実行できてる!」


アレサ 「プログラムの実行結果は fffffff1」


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


プログラムの実行結果

fffffff1


???


10進数

-15


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


printf出力表示した結果が


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


う~ん


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


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


このプログラムの実行結果が正しいとすれば


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



じゃあ


紙の上で実験してみようかな?


もろにf(10新数で15)+ fffffff1を計算してみると0になったりするのかな?


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


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



ffffffff+1=100000000


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



まず


ffffffffはfffffff0+fとなります


ということは


ffffffffに1をたす


ffffffff+1=100000000

fffffff0+f+1=100000000


とあらわされるというわけですね


そして


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


fffffff0+10=100000000


さらに変形をおこなうと


ffffff00+f0+10=100000000


となります


次に


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


ffffff00+100=100000000


となりますね


さらに変形すると


fffff000+f00+100=100000000


となります


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



fffff000+1000=100000000


さらに変形すると


ffff0000+f000+1000=100000000


となります


ここで


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


ffff0000+10000=100000000


となります


さらに変形すると


fff00000+f0000+10000=100000000


となります


f0000に10000が加えられると100000となるので


fff00000+f0000+10000=100000000



fff00000+100000=100000000


となります


さらに変形すると


ff000000+f00000+100000=100000000


となります


次に


f00000に100000が加えられると1000000となるので


ff000000+f00000+100000=100000000



ff000000+1000000=100000000


となり


さらに変形すると


f0000000+f000000+1000000=100000000


となります


次に


f000000に1000000が加えられると10000000となるので


f0000000+f000000+1000000=100000000

f0000000+10000000=100000000


次に


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



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


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


f+ fffffff1=

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


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


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


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


100000000=00000000と


100000000の


9桁目の1が消えて


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


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


f+ fffffff1=0


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


15+ fffffff1=0


fffffff1=-15かな、かな?


fffffff1は-15かな😊、かな😊?


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


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


アレサ。」


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


0000011111・・・


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


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


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


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


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


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


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


は~い、アクション!


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


は~い、カット!


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


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


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


僕は・・・


僕は・・・


はあ、はあ


あああああ


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


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


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


は~い、


プログラムの実行結果


fffffff1


の続きからアクション!


ソーラー 「プログラムが実行できてる!」


アレサ 「プログラムの実行は fffffff1」


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


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


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


16進数 fは10進数15だから


f+ fffffff1=(10進数)0


みたいなことになったら


fffffff1は-15になるよね



それでは


f+ fffffff1が(10進数)0


になるか


試してみましょう


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進数fは10進数15


であるということと


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

関係を用いると


(16進数)

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


💖イコール=💖


(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(33桁)目の


1は格納できず


100000000000000000000000000000000(33桁)=00000000000000000000000000000000(32桁)となります


ですので


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


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


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


15+ fffffff1=0


fffffff1=(10進数)-15かな、かな?


つまり


          16進数fffffff1



          10進数-15


 で表されるんだ(^_-)-☆  

                        」


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






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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る