基本型の構造とポインタ
ここまで分かるとほとんどポインタは完璧です。がんばってください。
コンピュータは電気で動くので、その動作の基本はONとOFFです。
仮に、ONの状態を1、OFFの状態を0で表すとします。スイッチが2つ横に並んでいるとすると
0 0: 2つともOFFの状態
0 1: 右側のスイッチだけONの状態
1 0: 左側のスイッチだけONの状態
1 1:両方ともONの状態
のように4通りの状態を表すことが出来ます。
例えば、
0 0 の状態を 0、 0 1 の状態を 1、 1 0 の状態を 2、そして、1 1の状態を3と見ると約束すると0から3までの数字を2つのスイッチで表すことが出来ます。
また、例えば
0 0 の状態を 0、 0 1 の状態を 1、 1 0 の状態を -1、そして、1 1の状態を-2と見ると約束すると-2から1までの数字を2つのスイッチで表すことが出来ます。
どちらも4通りの数を表しています。
今度はスイッチを8個にするとどうなるでしょう。
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 0
0 0 0 0 0 0 1 1
(中略)
1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1
と256通りの数を表すことが出来ます。
このスイッチのことをビットと呼びます。最初のスイッチの組み合わせでは、スイッチは2つなので2ビットで数を表しているといえます。8個の組み合わせは8ビットで数を表しているといえます。
char型
char型は、8ビットで表される数です。よって256通りの数を表現できます。charではマイナスの数も表現するので-128から127の数が扱えます。マイナスの数がいらない場合は、
unsigned char a;
のようにcharの前にunsignedを付けます。ただし、この場合はcharとunsigned charという別の型があると考えたほうが正解です。unsigned charは0から255までの数を表現できます。
int型
int型は、実行するパソコンによって異なりますが大抵32ビットです。皆さんの実習室のパソコンも32ビットです。64ビットのパソコンもありますが、皆さんが直接触るようになるのは何年か後でしょう。
32ビットもあるとかなり沢山の数が扱えて、4294967296通り使えます。intもcharと同じくマイナスの数も扱うので–2147483648 から 2147483647まで表現できます。charと同様intにもunsigned intという型があります。この場合0から4294967295までの数を表現できます。
double型
double型は更にビットが増えて64ビットで数を表現します。ただし、小数点がつくのでcharやint型よりも各ビットの使われ方は複雑です。ここでは詳細は省きます。
ここで、重要なのは型によってビットが異なるので同じ数を表しているとしても内部での表現方法が違うということです。
型とメモリの配置の関係
メモリの様子を直感的に説明したいと思います。プログラムで使われる変数、数字、文字などはメモリという場所に格納されます。また、プログラム自身もメモリに格納されます。
下の図のように、8ビットを単位としたマス目に変数や数字は配置されていきます。左側の数字はマスの位置(アドレス)を表す数字です。ポインタに代入されるのはこの マスのアドレスを表す数字なのです。
この図では
char a = 1;
として1が代入されたchar型の変数aは200100番のアドレスに格納されています。またその内容はビットで00000001と表現されています。また、
int c = 256;
として256が代入されたint型の変数cは200101番のアドレスに格納されています。ただし、intは32ビットで表されるので8ビットで構成されるマス目4つが使われています。
また、aは200100番に格納されているので&aは200100になります。同様に&cは200101になります。
型変換(キャスト)
charは8ビットでintは32ビットですからchar型の変数の内容をint型の変数に入れること、例えば、
char a = 10;
int b = a;
は大丈夫そうです。しかし、
int a = 256;
char c = a;
は問題があることは、分かるでしょうか?なぜか分からない人はこのページと図をもう一度よく読みなおしてください。
char a = 10;
のaの内容を
int b;
に入れるときは型変換が起こります。つまり8ビットのchar型として表していたものを32ビットのint型の表現に直してからbに入れます。
具体的には、
10 = 00001010 を 10 = 00000000000000000000000000001010に直します。このことを型変換又はキャストと呼びます。
型変換は色々なところで起こります。
以前出てきた例ですが、
#pragma hdrstop #include <condefs.h> #include <stdio.h> //--------------------------------------------------------------------------- #pragma argsused //メイン関数 //実行は必ずここから始まる。 int main(int argc, char* argv[]) {
int a = 1;
//整数型の変数aを使うことを宣言し、1を代入する。
double c = a + b;
//aの内容がdouble型に型変換されてから計算されている。
|
このプログラムの
double c = a + b;
のようにa とbで型が違う場合はビットの大きいほうの型に変換されます。つまり、aが32ビットの整数型でbが64ビットの実数型(正しくは倍精度浮動少数点型 double precision floating-point)なのでaの値が実数型に変換されます。
それでは、次に進みましょう。