ダイジェスト。
2進数の塊。どの桁をどう扱うなど決めることで、整数や実数、符号付きや符号なしを表現している。
基本的にはint , floatさえあれば困らない。それぞれ整数型、浮動小数点型。
「宣言」し、「代入」するためのもの。
例題は↓↓↓。
C言語では関数なしではプログラムできないに等しい。
関数は、数学的意味での関数の場合と、一連の動作を一行で行うために切りだした関数とがある。
関数には引数とよばれるパラメータを渡すことができる。
例題は↓↓。
グローバル変数とローカル変数がある。
グローバル変数は、適切に宣言さえすれば「どこからでも」「制限なしで」変更でき、また読むことができる。扱い次第では危険。
ローカル変数は、関数などのブロックの中だけで有効。そのブロックを終えると同時に消去される。関数内でのデータの一時退避に。
例題は↓。
例題(VC++推奨)
#include<stdio.h>
int bar; //グローバル変数。乱用には注意。
int hoge(void)
{ //←はブロックの始まりを表わす。
//このa,bはローカル変数。
int a; //宣言。整数型。大抵の整数はこれに格納できる。
float b; //宣言。浮動小数点型。ゲーム用途で実数を使いたいならこれで大抵問題ない。
a = 255; //数値に意味はない。今回のaは32bit符号付きなので、-((2^31)-1)から(2^31)-1までの数を格納できる。
b = (float)a; //整数と浮動小数点数は全く違うデータ構造だが、我々が意識する必要はない。
b = a; //↑と同意の処理。
a = b; //実数から整数へも変換できる。
b = 2.5f; //試しに整数でない数を入れてみよう
a = b; //ハードウェア構成に起因する合理的処置によって、小数点以下は切り捨てられるので、この時点でa == 2となる。
bar = a;//グローバル変数に代入。
return 0;
};//ブロック終わり。a,bはローカル変数なので、ここで破棄される。
int main(void)
{
hoge();
printf("%d" , bar); //barにはしっかりと代入されている。
return 0;
};
※ブロックについて
ブロックとは、ブロックである。処理の単位の一つ。
関数の実体を書くときに{}を用いるのがもっとも有名だが、あえていうならば、名前をつけて任意に呼べるようにし、さらに引数(ひきすう)を与えることのできるブロックを関数と呼ぶ、ともいえる。
ブロックは省略できる場合があるし、意味なく囲ってしまうことによって何か不都合が起こるわけでもない。
だから、
#include <stdio.h>
int main(void)
{
{
{
printf("?\n");
}
printf("!\n");
}
return 0;
};
などとひねくれた書き方もできる。
この場合は無意味だが、関数の一部でその場かぎりしか使わない(せいぜい数行後で読みだして、あとは役目がない)ようなローカル変数は、邪魔なのでブロックの中に隔離することもできる。
たとえば、
#include <stdio.h>
int main(void)
{
{
int i;
i = 50; //数値に意味はない。
}//ここでiは破棄される。
{
int i;//再定義。
printf("%d" , i); //でたらめな数が表示されるはず
}
return 0;
};
※何故切り捨てられるのか?
2.5を整数に直すと、2になる。
コンピュータは切り上げしないし、四捨五入のような処理もない。
2.5とは、0b10.1である。十進数の小数第一位が1/10であるように、二進数においては小数第一位は1/2を指す。すなわち0.5である。
なぜ2.5が2になるのか、といえば、それは、整数になおすときに「小数点の位置より右の桁を全て削除」しているからだ。
もし、(単純化のため)4ビットの仮数部と4ビットの指数部を持つとすると、2.5は0b_0101_0001と表わされる。
すなわち、仮数部を指数部の数分ビットシフトすると切り捨てたことになる。
(0b0101>>>0b0001) == 0b010
これはコンピュータにとって自然な命令である。
これが切り上げや四捨五入になると、非常にコンピュータにとって不得意な命令を実行することになる。そのため、標準的な処理としては切り捨てが行われる。
最終更新:2013年04月29日 17:28