キャスト演算子をもちいて変数に格納されている数値を整数値から実数値、実数値から整数値に変換してみましょう。


キャスト演算子をもちいて変数に格納されている数値を整数値から実数値、実数値から整数値に変換してみましょう。




清美 「みんな まってました ついにキャスト演算子の登場です。」


清美がついにカールトン問題の解決策をもって登場する。


聡子 「なに キャスト演算子って 新ネタ・・・?」


聖美「ごくっ・・・ついに ラスボスの登場の予感・・・」


清美「聡子ちゃんも 聖美ちゃんもよくみてて。


次のプログラムは


float型の変数 aに格納された実数値1.5に


整数値2をかけあわせるプログラムです。


#include <stdio.h>


int main(void)

{

float a;

a=1.5;


printf("%d\n",a*2);

return 0;

}


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


0


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


プログラムをデバッグなしで実行すると


いったん


警告 C4477 'printf' : 書式文字列 '%d' には、型 'int' の引数が必要ですが、可変個引数 1 は型 'double' です Project6 c:\users\solarplexuss\source\repos\project6\project6\source.cpp 8


と表示されます,が




0が表示されます。



このプログラムでは


🍎実数の型float型の変数aに🍎格納されている実数値1.5


×(かける)


🍒整数値の型int型(の形式でメモリ)に🍒格納されている整数値2


が行われようとしています。


コンピュータは同じ型同士の数値計算しかできないため


整数値の型に格納されている整数値

実数値の型に格納されている実数値


が混ざった計算をするときは


整数値の型に格納されている整数値は実数値の型に格納されている実数値に格納し直されるという


仕組みにより


整数値の型に格納されている整数値2は実数値の型に格納し直され実数値2.000000(仮の表現です)となります


となると


🍎実数値の型float型の変数aに🍎格納されている実数値1.5


×(かける)


🍒整数値の型int型(の形式でメモリ)に🍒格納されている整数値2





実数値の型float型の変数aに格納されている実数値1.5×実数値の型に格納しなおされた実数値2.00000(仮の表現です)


に変換されて計算がおこなわれます


計算結果の


a*2も実数の型に格納された実数値となります。


その実数値であるa*2を


「整数値をprintf出力表示する%d出力変換指定子」をつかって


printf("%d\n",a*2);

のように

printf出力表示しようとしているので


このような正しくないプログラムの実行結果になります。


ですので


今のプログラムの


%d出力変換指定子

の部分を

%f出力変換指定子に変更して


コンパイルすると


#include <stdio.h>


int main(void)

{

float a;

a=1.5;


printf("%f\n",a*2);

return 0;

}


プログラムの実行結果


3.000000

正しいプログラムの実行結果が出てきます


ね 聡子ちゃん」


聖美 「どこかで おなじことをやったことがあるような・・・・・」


清美「ここで


キャスト演算子の登場です


まあ みててね


変数aにキャスト演算子をもちいます


キャスト演算子() とは変数に作用する演算子で


(int)a や (float)b

のように記述されます。


(int)aと記述されたなら


変数aがfloat型の変数で


変数aに格納されている数値が実数値だったとしても


変数aに格納されている実数値は


(int)によって整数値に変換されます。


(float)bと記述されたなら


変数bがint型の変数で変数bに格納されている数値が整数値だったとしても


変数bに格納されている整数値は


(float)によって実数値に変換されます。


ですので


今のプログラムで


実数値1.05を格納している実数値の型float型の変数aに


キャスト演算子(int)を用いると


float型の変数aに格納されている実数値1.5は


小数点以下の0.5が切り捨てられ


整数値1に変換され


(int)a=1


をあらわすことになります


ですので


(int)a*2=2


となり


(int)a*2を用いた


以下のプログラムの実行結果は

👇


#include <stdio.h>


int main(void)

{

float a;

a=1.5;


printf("%d\n",(int)a*2);

return 0;

}


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

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



となります


次のプログラムでは

👇

#include <stdio.h>


int main(void)

{

int b;

b=1;


printf("%f\n",(float)b*2);

return 0;

}


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

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


2.000000


👆

int型の変数bに


キャスト演算子(float)が用いられています




int型の変数bに


キャスト演算子(float)を用いた


(float)bは実数値1.000000(仮の表現です)となります。


int型の変数bに格納されている整数値1は


実数値の型の形式でメモリに格納しなおされます。


仮にわかりやすくいうと


整数値1は


実数値の1.000000(仮の表現です)に変換され


(float)bは実数値1.000000(仮の表現です)を表すことになります。


よって


(float)b*2は


実数値の型に格納されている実数値1.000000×整数値の型に格納されている整数値2


となります。


ここで


コンピュータは同じ型同士の数値計算しかできないため


整数値2は実数値の型の形式でメモリに格納し直され


( 実数値の型に格納されている実数値×整数値の型に格納されている整数値         の計算においては


整数値の型に格納されている整数値



実数値の型に格納されている実数値


に変換されるので


実数値の型に格納されている実数値×整数値の型に格納されている整数値         の計算は


実数値の型に格納されている実数値×実数値の型に格納されている実数値

の計算

に変換されます)


仮にわかりやすくいうと


整数値2は


実数値2.000000となり


今の


実数値の型に格納されている実数値1.000000×整数値の型に格納されている整数値2


実数値の型に格納されている実数値1.000000×実数値の型に格納されている実数値2.000000


となります


そうなると


(実数値の型に格納されている実数値×実数値の型に格納されている実数値


の計算結果も


実数値の型に格納されている実数値となるので)



実数値の型に格納されている実数値1.000000×実数値の型に格納されている実数値2.000000


の計算結果も実数値の型に格納されている実数値となります



ですので


実数値×整数値をあらわす


(float)b*2


の計算結果も


実数値の型に格納されている実数値となります


そのため


(float)b*2の計算結果


をコマンドプロンプト画面に表示する際


printf関数内では


printf("%f\n",(float)b*2);


のように


実数値をprintf出力表示する%f出力変換指定子がもちいられます。


ここまで いいかな?」



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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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