しゃお~ん 基本事項の確認にゃん🐈int a=1; の実行においては int型の形式でメモリに格納された数値データ1 がint型の変数aに格納されることになります

printf("%d¥n", 1);が実行されると数値データ1は自動的にint型の形式で 数値データ1.0ならdouble型の形式で自動的にメモリに格納されます printf関数の基本的な仕組みです


printf("%d\n", 1);が実行されると


数値データ1は自動的にint型の形式で 

数値データ1.0ならdouble型の形式で

自動的にメモリに格納されます 

printf関数の基本的な仕組みです



ソーラー「今日は



        😊とってぇ~も😊



   基本的で根本的なprintf関数の仕組みについて学んでみたいとおもいます」


アレサ「基本的で根本的なprintf関数の仕組みについてですの?


ソーラーさん」



ソーラー「そうなんだよ


まずは


次のプログラムをごらんください」

👇


#include<stdio.h>


int main(void)

{

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


return 0;

}


ビルド実行結果


1


ソーラー「登場したね


基本的なプログラムだね😊


このプログラムでは


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


の実行により


コマンドプロンプト画面に


1


が表示されています



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


が実行されるとき


整数値データ1 は



         💖自動的に💖




        💖int型の形式でメモリに💖



格納されることになるんだよ



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


が実行されるとき


1



int型に格納されるよう指定したわけではないんだけどね(*´ω`*)


prinf関数の基本的な仕組みというわけだね」



アレサ「ソーラーさん


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


が実行されるとき


まず


数値データ1が


      💖int型の形式でメモリに💖


格納されてから


コマンドプロンプト画面に1が表示されるということなのですか?」


ソーラー「そうなんだよ


             まず


数値データ1が


      💖int型の形式でメモリに💖


格納されてから


というのがポイントだね


メモリに格納されたデータを


コンピュータは利用しているというわけなんだ」


アレサ「ソーラーさん


では


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


が実行されるときは


100は


自動的に


int型の形式でメモリに格納されるのでしょうか?」


ソーラー「そうなんだ


基本的に


         整数値データは



  int型の形式でメモリに格納されることになります」



ソーラー「それでは



次のプログラムを見てほしいな」


👇


#include<stdio.h>


int main(void)

{

printf("%f\n", 1.0);


return 0;

}


ビルド実行結果


1.000000



ソーラー「このプログラムでは



printf("%f\n", 1.0);


が実行されて


コマンドプロンプト画面に


1.000000


が表示されています


このとき


実数値データ1.0 は



         💖自動的に💖




      💖double型の形式でメモリに💖



格納されることになるんだよ


double型の形式というのがポイントだね


これもprintf関数の基本的な仕組みなんだ」


アレサ「


整数値データ1はint型の形式で


実数値データ1.0はdouble型の形式で


メモリに格納されるのですね」


ソーラー「ここで


ちょっと遊んでみようかな


今のプログラムの


%f出力変換指定子を


%d出力変換指定子に


変更してプログラムを実行してみるよ~ん


そのプログラムはこちらです」


👇


#include<stdio.h>


int main(void)

{

printf("%d\n", 1.0);//%f出力変換指定子を%d出力変換指定子に変更しました


return 0;

}



警告 C4477 'printf' : 書式文字列 '%d' には、型 'int' の引数が必要ですが、可変個引数 1 は型 'double' です


が表示されて


コマンドプロンプト画面には


0

が表示されます


書式文字列 '%d' には、型 'int' の引数が必要です


が表示されているね


このことは

printf

の第1引数が

%d出力変換指定子の場合


第2引数に

用いられるのは

int型の形式でメモリに格納されるデータ


すなわち


整数値データ


もしくは


整数値データを格納するint型の変数でなければならないことを示しています」



アレサ「よく観察すると


実数値データ1.0を表示するのに


%f出力変換指定子を用いずに


%d出力変換指定子を用いたためでしょうか


1.0でなく


0


がコマンドプロンプト画面に表示されています」


ソーラー「そうなんだ


そして


ちょっと警告文に注目してみてよ

👇

警告 C4477 'printf' : 書式文字列 '%d' には、型 'int' の引数が必要ですが、可変個引数 1 は型 'double' です



その中の


可変個引数 1 は型 'double' です


に着目してみるよ


まず


可変個引数とは何かということだよね」


アレサ「可変個引数・・・ですか


引数の数を変化させることが可能ということですか??」


ソーラー「そうなんだよ


printf関数を用いる場合


書式は


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


のように記述されるよね


一般に


printf関数を用いる場合



ダブルクォーテーション" "で囲まれた第1引数の部分は


以下のように必ず記述する必要があります


printf("第1引数は必要です");


つまり


printf関数には必ず1個の引数が存在することになります


また


printf関数を用いる場合


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


のように記述することもできます


ダブルクォーテーション" "で囲まれた第1引数の部分は絶対に必要ですが


第2引数 1

第3引数 2

第4引数 3


の部分は


その時の状況によって


必要だったりしなかったりします


引数の数が変化するというわけだね


だから


第2引数 1

第3引数 2

第4引数 3

可変個引数というんだね


さて


可変個引数 1 は型 'double' です



とは


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


可変個引数である

1.0



double型の形式でメモリに格納されていることを表しているんだよ


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


が実行されると


実数値データ1.0



自動的に


double型の形式でメモリに格納されているんだね」


アレサ「この警告文にはそのような意味があったのですね」


アレサ「ソーラーさん


int型の形式では


-2147483648から2147483647までの整数値データを


メモリに格納することができますが


2147483647

よりも大きな整数値データ

10000000000


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


のように記述した場合


この数値データ10000000000



どの型の形式でメモリに格納されることになるのですか?」



ソーラー「ははっアレサ


ナイスでタイムリーな質問だね


では

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


が記述されたプログラムを実行してみようかな」

👇


#include<stdio.h>


int main(void)

{


printf("%d\n", 10000000000);//%f出力変換指定子を%d出力変換指定子に変更しました


return 0;

}



警告文



警告 C4477 'printf' : 書式文字列 '%d' には、型 'int' の引数が必要ですが、可変個引数 1 は型 '__int64' です


が表示されて


コマンドプロンプト画面に


1410065408


が表示されます


ソーラー「この場合


数値データ10000000000は


__int64型に格納されているんだよ


だけど


%d出力変換指定子では


__int64型に格納された数値データを


ただしく


コマンドプロンプト画面に


表示することはできないので


コマンドプロンプト画面に


1410065408


が表示されているんだね


ところで


           __int64型



とは


見たことのない型だね


__int64型


とは


Microsoft社によって独自に開発されたデータを格納する型のことなんだよ


他にも

__int8

__int16

__int32


等のデータを格納する型があるんだよ


ちょっと見たことのない型だね



__int8は1バイトのデータ格納容量をもちますので


char型に相当し-128 ~ 127までの整数値データを格納することができます



__int16は2バイトのデータ格納容量をもちますので


short型に相当し-32,768 ~ 32,767までの整数値データを格納することができます


__int32は4バイトのデータ格納容量をもちますので


int型に相当し-2,147,483,648 ~ 2,147,483,647までの整数値データを格納することができます



そして

__int64は8バイトのデータ格納容量をもちますので


long long型に相当し-9,223,372,036,854,775,808 から 9,223,372,036,854,775,807までの整数値データを格納することができます


アレサ「__int64なら約922京までの整数値データを格納できるのですか


それなら


それよりずっと小さい10000000000なら十分に格納可能ですの(*^^*)」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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