コンピュータに扱える数値には範囲があります その9☆マックス 瞑想中です


コンピュータに扱える数値には範囲があります その9☆マックス 瞑想中です



この897545*100000だけを記述して実行すると・・・


近くに置いてあるノートパソコンのところに行き


パソコンを起動させる。


エディタにプログラムをかきこむ。


#include <stdio.h>


int main(void)


{

printf("%d\n",897545*100000 );

return 0;

}


897545*100000を計算するために


897545*100000を


printf関数の第2引数に記述し


実行すると・・・


プログラムの実行結果(EAZY IDECの場合)


-439813216

続行するには何かキーを押してください_



と表示されます


プログラムの実行結果(Visual Studio2018の場合)


__________________________________


警告 C4307 '*': 整数定数がオーバーフローしました。 Project6 c:\users\solarplexuss\source\repos\project6\project6\source.cpp 6

とエディタ画面下部に表示されますが

__________________________________


デバッグなしで実行すると


-439813216

続行するには何かキーを押してください_


と表示されます



プログラムの実行結果(Visual Studio2019の場合)


__________________________________


重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態

警告 C26450 演算のオーバーフロー: '* の操作はコンパイル時にオーバーフローを引き起こします。オペランドを格納する幅の広い型を使用してください (io.1)。 Project2 C:\Users\solar\source\repos\Project2\Project2\program1.cpp 6

警告 C4307 '*': 署名された整数定数のオーバーフロー Project2 C:\Users\solar\source\repos\Project2\Project2\program1.cpp 6


とエディタ画面下部に表示されますが

__________________________________


デバッグなしで実行すると



-439813216


C:\Users\solar\source\repos\Project2\Debug\Project2.exe (プロセス 307308) は、コード 0 で終了しました。

このウィンドウを閉じるには、任意のキーを押してください...



と表示されます




やはり・・・897545*100000を計算することができず


エラーがでるのか・・・


897545*100000を普通に電卓で計算すると


89754500000・・・


ならば


89754500000・・・


この数値をprintf関数の第2引数に記述し


実行すると


#include <stdio.h> int main(void)

{

printf("%d\n",89754500000 );

return 0;

}


プログラムの実行結果(EAZY IDECの場合)


-439813216

続行するには何かキーを押してください_


が表示されます


プログラムの実行結果(Visual Studio2018の場合)


警告 C4307 '*': 整数定数がオーバーフローしました。 Project6 c:\users\solarplexuss\source\repos\project6\project6\source.cpp 6

と表示されますが


デバッグなしで実行すると


-439813216

続行するには何かキーを押してください_


が表示されます


プログラムの実行結果(Visual Studio2019の場合)



重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態

警告 C6328 サイズの不一致: '__int64' が _Param_(2) として渡されました。'int' が 'printf' への呼び出しに必要です。 Project2 C:\Users\solar\source\repos\Project2\Project2\program1.cpp 4

警告 C4477 'printf' : 書式文字列 '%d' には、型 'int' の引数が必要ですが、可変個引数 1 は型 '__int64' です Project2 C:\Users\solar\source\repos\Project2\Project2\program1.cpp 4

と表示されますが


デバッグなしで実行すると


-439813216


C:\Users\solar\source\repos\Project2\Debug\Project2.exe (プロセス 309464) は、コード 0 で終了しました。

このウィンドウを閉じるには、任意のキーを押してください...


が表示されます


プログラムの実行結果は


897545*100000と記述しても89754500000と記述しても


両方とも


-439813216と同じ・・・


ということは


おそらく


コンピューターの中では一応897545*100000=89754500000は


計算されているようだな・・・・


そうだひらめいた。


89754500000は11桁の整数だ。


11桁の整数は正しく


コマンドプロンプト画面にprintf出力表示できないなら、


正しくprintf出力表示される桁数もあるに違いない・・


それが何桁かをしらべるには・・・


1桁の整数、2桁の整数、3桁の整数・・・・・・・・


を順番にprintf関数の第2引数にかきこんで実行して


何桁までの桁数が正しくコマンドプロンプト画面に表示


されるか確かめればよい・・・確実かも・・・・・・


ははははは


我ながら名案だ・・・


つまり


1        (1桁)

12       (2桁)

123       (3桁)

1234      (4桁)

12345      (5桁)

123456     (6桁)

1234567     (7桁)

12345678    (8桁)

123456789    (9桁)

1234567891   (10桁)

12345678912   (11桁)


この11個の数値をprintf出力表示してみればよいのだ・・・


11桁といえばprintf出力表示に失敗した


89754500000も11桁の整数だ・・・


89754500000をprintf出力表示したなら


-439813216


が表示されるのなら



おそらく11桁の12345678912  (11桁)



12345678912



代わりに変な数値がprintf出力表示されるんじゃないかな・・・


・・・


では これらの11個の数値を


#include <stdio.h>


int main(void)


{

printf("%d\n",1 );

printf("%d\n",12 );

printf("%d\n",123 );

printf("%d\n",1234 );

printf("%d\n",12345 );

printf("%d\n",123456 );

printf("%d\n",1234567 );

printf("%d\n",12345678 );

printf("%d\n",123456789 );

printf("%d\n",1234567891 );

printf("%d\n",12345678912 );

return 0;

}



コンパイルっ


プログラムの実行結果


1

12

123

1234

12345

123456

1234567

12345678

123456789

1234567891

-539222976


おおっでたでた 


10桁までは正しくprintf出力表示されるみたいだ・・・


11桁の12345678912は


-539222976とprintf出力表示されたか・・・


うまく


12345678912



12345678912

printf出力表示されないか・・・



つまり


10桁の整数までただしく出力できるということか・・・


ほかの10桁の整数もためしてみるか・・・


1784948595


3456789999


2349098900


これら10桁の数値を


printf関数の第2引数にかきこんで実行してみよう。


#include <stdio.h>


int main(void)

{

printf("%d\n", 1784948595);

printf("%d\n", 3456789999);

printf("%d\n", 2349098900);

return 0;

}


コンパイルっ


プログラムの実行結果(EAZY IDECの場合)

プログラムの実行結果(Visual Studioの場合)



1784948595


-838177297


-1945868396


むー10桁もただしくprintf出力表示されないか・・・・?


しかし 

printf("%d\n", 1784948595);


の実行結果は


1784948595


と成功している・・・・・?


・・・・・・


printf("%d\n", 3456789999);


の実行結果は


-838177297


printf("%d\n", 2349098900);


の実行結果は


-1945868396



この2つはなぜか失敗している・・・・・?


10桁は一部成功している・・・


10桁には出力可能な整数値とそうでない整数値があるようだな・・・


このことは


コンピュータが 扱える数値の範囲の限界が


この10桁の整数値内の どこかにあることをあらわしている・・・


10桁ならば


なんでもprintf出力表示できるとはいえない・・・か・・・


  だめか・・・・


では・・・


178494859


345678999


234909890


これらの9桁の数値ならどうだ・・・・


#include <stdio.h>


int main(void)


{

printf("%d\n",178494859 );

printf("%d\n",345678999 );

printf("%d\n",234909890 );


return 0;

}


コンパイルっ


プログラムの実行結果(EAZY IDECの場合)

プログラムの実行結果(Visual Studioの場合)


178494859

345678999

234909890


続行するには何かキーを押してください_


おおっ3つともただしくprintf出力表示された・・・


これで正しくprintf出力表示できる整数値は9桁できまりか・・・



















































































































































































































































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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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