エムゲーム・ジャパン ゲーム ミィア ブログ サークル マイエム Login

兵どもの夢の跡

ブログチャンネル
yuki002さん
 
 ブログトップ   マイブログ   ランダムブログ    
ブログ型ブログ型タイトル一覧タイトル一覧
14.変数の型[ソフトウェア考]  
詳細/おすすめ(2330/0) | ソーシャルブックマーク(0)  2009/08/08 01:40

変数ってなに?

 

【13.メモーリーの話】 では変数の概念を少しだけ書いてみましたが、

こちらでは もっと突っ込んだ話になります。

 

まず【変数】の性質からです。

 

 

 

ちょっと おさらい

 

情報の最小単位は bit です。

0と1 Yes と No true(真)とfalse(偽) という様にブール値そのものなのです。

そして2進法で表されるのが特徴です。

この bit を2進法で組み合わせ、情報の種類を定義します。

そして 8 bit = 1byte として文字や数字にコードとして割り当てます。

アルファベットを使う文化圏では 8 bit の範囲で全ての文字が割り当て可能です。

このため 8 bit = 1byte が基準になり 1 byte ごとにアドレスが割り振られます。

ちなみに、日本語など表意文字文化圏では文字数そのものが多いため、2 byte で1文字を表します。

 

CPUのアーキテクチャに注目してみます。

8ビットCPU であれば、内部の演算レジスタが8ビットですから、

メモリに対しては そのまま byte 単位でアクセス可能です。

16ビットCPUになると、演算レジスタが16ビットになるので、

メモリーに対しては一度に 2 byte のアクセスが可能になります。

同様に32ビットCPUでは 4 byte、 64ビットCPUでは 8 byte です。

一度にアクセスできるメモリが大きいからこそ処理速度や扱う整数範囲が大きくできるわけです。

 

CPUで最もスタンダードな変数型は整数型です。

8ビットCPUを基準にすれば、本来は自然数で 0 〜 256 なのですが、

整数における負数を扱うため、左端の1ビットを符号として  -128 〜 +127 だったりします。

これが 1 byte で表現できる数値なのです。

16ビットCPUになれば 0〜 65535 と -32768〜+32767 になるのですが、

数値を保持するために必要なメモリは 2 byte になります。

同様に 32ビットCPUでは 4 byte、64ビットCPUでは 8 byte です。

整数型とは言っても厳密には【符号無し整数】と【符号付整数】があるわけです。

 

なんか すごく回りくどい説明ですね。

でも、これが大切な事なのです。

整数とは言っても処理系(CPUのビット数)によって、

扱える数値範囲や必要とするメモリーの大きさが違うのです。

その違いを無視して【整数型】として定義しているのですから。

 

 

 

処理系によって異なる変数型

 

さて…ここからが核心です。

32ビットの処理系では「整数」を扱うのに 4 byte 必要ですね?

一方で8ビット系なら 1 byte で十分です。

32ビット系で -128 〜 +127 の数値を扱う時 実は 4 byte のメモリーが必要なのです。

【整数型】として変数定義すると、そのCPUで扱う事のできるレジスタサイズがそのまま変数サイズになるのです。

そういう訳で、たとえ 8ビットで事足りる数値であっても 4 byte (32 bit)必要という事なのです。

 

中学レベルの数学では、変数とは単なる数値の入れ物に過ぎません。

ですが、プログラミングにおける変数は物理的制約によって型が決まってしまうという事なのです。

整数型の例では 符号の有無とレジスタサイズが制限になります。

これは整数型だけではなく、その他の型にも制約があるという事なのです。

 

その例として【ポインタ変数】というものがあります。

ポインタとは、簡単に説明するとデータなどの場所を指定するアドレスそのものなのです。

32ビット処理系の殆どは アドレスも32ビットです。

ポインタを保持するための変数も それに習い 32ビット、すなわち4バイトなのです。

これは実質「整数型」と同じなのです。

 

ところが、MS-DOS の時代は そうではありませんでした。

データを処理するレジスタは確かに16ビットでしたが、アドレスそのものは16ビットでは不足したため、

20ビットを用いていたのでした。

するとアドレスを絶対値で指定する場合には2バイト以上のメモリ領域が必要になります。

つまりアドレス変数は整数型ではなかった訳です。

ところが、アドレス数値は整数型で扱う方が断然便利なのです。

なぜなら レジスタが16ビットだからです。

本来であれば20ビットの演算そのものは不可能なのですが、利用法とちょっとした仕掛けで

それが可能になっていたのでした。 (詳しい話は いずれ またしますが。)

 

という訳で、変数に型指定は付き物で、それは処理系によって異なる という訳なのです。

最近の高級言語では変数サイズや型を意識させないものが多いのは、

このような面倒を避ける目的で、処理系の差異を吸収し隠蔽していると言えます。

(だから処理速度が遅いので ハイポテンシャルなマシンを必要とするのです。)

 

 

 

変数型の種類

 

基本となるのは 整数型 です。

それ以外には キャラ型、 長整数型、 長長整数型 があります。

整数型には それぞれ 符号無し と 符号有り があります。

8ビットCPUなどでは 扱う数値範囲の狭さから 演算アルゴリズムによって拡張されます。

C系では

  • char : 0 〜 127
  • short int : 0 〜 65535 (-32768 〜 +32767) ※32ビット以上の環境で
  • int : レジスタサイズそのものの範囲
  • long int : 0 〜 64ビットの範囲

などが定義され、処理系によってサイズも異なります。

符号有りでは  signed 符号無しでは unsigned などプレフィックスを付けたりします。

 

整数型以外ではポインタ型が多く使われます。

変数がどこにあるのかを示すアドレスそのものなので、実態は整数型と同じです。

C言語系では char * や int * と表記されますが変数サイズそのものはCPUのレジスタサイズです。

 

特殊なものでは bool 変数があります。

変数サイズは 整数型 なのですが、変数は 0 または 0以外 の2種しかありません。

意味的には真/偽を表せれば良いので このような変数が使われます。

 

その他にも 文字変数や日付け変数などがありますが、その実態は ポインタ変数なのです。

データ型は論理的構成なので、ハードウェアの制約を受けません。

純粋にメモリ上に置かれ、ポインタ変数からデータの場所を特定し、データを読み込みます。

 

様々な変数型が存在しますが、その大部分の実態はアドレス変数で、

純粋に演算可能な整数値を扱う場合にのみ範囲や大きさの制約が生まれます。

 

 

 

今回は変数の型について書いてみました。

これで「なぜ型指定するのか」と「型指定の意義」はご理解できたかと思います。

そもそもは【レジスタで処理を行う】というCPUの大原則が根本であるという事ですね。

 

この記事のURL /  カテゴリ /  コメント(2)  / おすすめ  / 通報
   カテゴリが追加できません!
   某 腐れサイトの話