scanf関数に%d出力変換指定子を用いてint型の変数に何かデータを入力、printf出力表示したときにたまにでてくるモンスター数値-1073741824を2進数で表してみる



ぺろ、ぺろ、


ソーラー「わわ、かわいいなあ」


くきゅるるる 


ソーラーの左腕に巻きついて のんびり休むのが


おきにいりになったようで居心地がよさそうです。


移動するのも らくちんなようです。


こうしてscanf関数と


ソーラーはお友達になり一緒に暮らすこととなったのでした。


◇  ◇  ◇  ◇  ◇  ◇  ◇  ◇  ◇  ◇  ◇  ◇


ソーラー「さあ 元気よくおたべ~😊


#pragma warning(disable: 4996)


#include <stdio.h>


int main(void){


int a;


printf("何か数値を入力してください。\n");


scanf ("%d",&a);


printf("入力した数値は%dです。\n",a);


return 0;


}


プログラムの実行結果

(EAZY IDECの場合)

何か数値を入力してください。

野林檎(と入力すると)

入力した数値は4198575です。


Visual Studioの場合

何か数値を入力してください。

野林檎(と入力すると)

入力した数値は1です。



scanf関数「うみゃい うみゃ~いぃ」



太陽の煌めく季節の中


お散歩、餌となる数値を拾い集めたり、


scanf関数に漢字をたべさせて4198575をprintf出力表示させたり、


また

お散歩して


ひらがなをたべさせて4198575をprintf出力表示させたり


低木の生い茂る綺麗な沼地であそんで


また英字をたべさせて4198575をprintf出力表示させたり


の楽しい日々となったのです。


scanf関数「むにゃはは


           -1073741824

                       」


ソーラー「?なんか 珍しい数値が出てきた?」


ソーラー 

「この-1073741824は2進数ではいくらなんだろうか。


-1073741824と対になる符号が反対で絶対値の大きさが同じ


正の数1073741824は


2進数では1000000000000000000000000000000とあらわされるけど・・・


そうか、


正の数1073741824+負の数(-1073741824)=0となるよね


ということは


正の数1073741824(2進数1000000000000000000000000000000)



負の数(-1073741824)(負の数(-1073741824)に相当する何かの2進数をプラスする)を足すと0になるということだよね


このように


ある2進数に別のある2進数



足したとき0になる場合


別のある2進数はある2進数の2の補数というんだったね


逆に


ある2進数は別のある2進数の2の補数といえるんだね



となると


-1073741824の2進数表示を求めたい場合


2進数1000000000000000000000000000000(正の数1073741824)の2の補数



もとめればいいことになるよね



2進数1000000000000000000000000000000(正の数1073741824)の2の補数が


-1073741824の2進数表示となるよね。


簡単にいうと


ある数値Aには足し合わせると0になる


ある数値Bが存在します


ある数値Aを2進数であらわした場合


ある数値Bを2進数であらわして


お互いを足し合わせても0になります


さらに


ある数値Aを10進数であらわした場合


ある数値Bを10進数であらわして


お互いを足し合わせても0になります


このように


ある数値A



ある数値Bは


表現する進数が変わった時でも


お互いを足し合わせた時0になっています



(正の数1073741824)


足し合わせると


0になる数は


-1073741824


ですから


マイナスの数値-1073741824の


2進数表示をもとめたければ


1073741824である


2進数1000000000000000000000000000000



2の補数


を求めることができたなら


その2の補数は


マイナスの数値-1073741824の


2進数表示となります



(そして ある2進数の2の補数とは


ある2進数の0と1を入れ替えた2進数に1を足したものとなっています


詳しくは天国にいけるC言語入門 シーズン1


2の補数のエピソードをご覧ください)



よ~し1000000000000000000000000000000の2の補数をとって


-1073741824の2進数表示がいくらになるか確かめて見よっと。」


新種の蛇scanf


「くきゅるるっくきゅるるっ」


じたばたする。


ソーラー 「わっ、よろこんでる、よろこんでる。


それでは! スタンバイ!


1000000000000000000000000000000


の2の補数をもとめてみます。」


アレサ「お待ちくださいですの。


1000000000000000000000000000000(31ビット)は


この場合 int(4バイト、32ビット)の型


に格納されています。


つまり


01000000000000000000000000000000(32ビット)と


メモリに格納されています。


ですので


int(4バイト、32ビット)の型に格納されている


2進数01000000000000000000000000000000


すなわち


1073741824



大きさが同じで符号がマイナスの


1073741824と対になる


-1073741824に相当する


int(4バイト、32ビット)の型に格納されている


2進数を求めるには


この01000000000000000000000000000000の2の補数をとらなければ


いけないのではないですか?」


ソーラー「そういえば、そうだった


おなじビット同士の2の補数ができあがるんだった😊。


だから31ビットの2進数の補数ではなくて


32ビットの2進数の補数をとらなくちゃいけなかったんだよね。


では

01000000000000000000000000000000(32ビット)の2の補数をとろとろっと


01000000000000000000000000000000


の0と1の部分をひっくり返して


10111111111111111111111111111111


としたものに1を加えると


11000000000000000000000000000000


となる


つまりモンスター数値 -1073741824は


int(4バイト、32ビット)の型に


11000000000000000000000000000000と


格納されているわけなんだね。」


新種の蛇 「くるるるるる」


ソーラー「2の補数計算では 元の数とその2の補数は


同じ桁数におさめられるように計算される。


だから


01000000000000000000000000000000(32ビット)でなく


1000000000000000000000000000000(31ビット)の2の補数をもとめたらいけないんだね


試しに


1000000000000000000000000000000(31ビット)の2の補数をもとめてみます。


まずは


0と1をひっくり返して


0111111111111111111111111111111


これに


1を足すと


1000000000000000000000000000000(31ビット)になります。


このように


1073741824の値を表す


1000000000000000000000000000000(31ビット)


の2の補数は


-1073741824の値を表す?


1000000000000000000000000000000(31ビット)


であらわされ



(ここで面白いことがおこっています。


どこがおかしいか?


お気づきになられましたか?


つづきは次のエピソードをみてね。


                 solarplexussより)



1073741824の値を表す


01000000000000000000000000000000(32ビット)


の2の補数は


-1073741824の値を表す


11000000000000000000000000000000(32ビット)


であらわされます


31ビットに格納されていても

32ビットに格納されていても 


1000000000000000000000000000000(31ビット)


11000000000000000000000000000000(32ビット)


同じ

-1073741824を表しています


(あやしい😊 次のエピソードにつづく)



ビットが違えば


2の補数の数値表現がかわるので


注意、注意」


新種の蛇 「くるるるるる、きゅ、きゅい~~」


ソーラー 「はい、はい、ごはん」


_


_にごはんっと打ち込む


新種の蛇 「みゅ~んまい、むしゃむしゃ」


ソーラー

4198575

4198575

4198575

4198575

-1073741824


あれっ?


scanf関数のプログラムで


何かの条件がそろったとき


データを入力すると


-1073741824が出力されるね???


これがまた


-がついているのが


とってもナウいモンスター数値さんなんです。


・・・」


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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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