見出し画像

変数の型 - 整数と小数

プログラミング言語を学ぶと最初の段階で変数と型というものを覚えることになります。言語によって使える型とその表現はさまざまですが、基本的には

  • 整数

  • 小数

  • 文字または文字列

  • 特殊なもの

に分類されます。

それぞれの型には格納できる値の範囲、つまり何ビット分の大きさがあるのか、マイナスの数を扱えるのかみたいな分類はありますが、表現の違いこそあれ、どの言語も似たりよったりです。言語によっては型自身を定義することも出来る場合があるのですが、基本は同じです。

それというのも基本となる話として、CPUが扱える値がこれらしか無いからです。そこでCPUが値をどのように扱うのかを見てみましょう。

コンピュータの数値表現


まずは整数です。

よく何ビットCPUという名前を聞くことがあると思いますが、この何ビットはCPUが1度に扱える最も大きいサイズを示しています。扱う値のサイズがCPUのビット数よりも大きい時は、何度かに分けて処理しています。サイズがCPUのビット数よりも小さい時は、そのサイズを扱う命令がちゃんとあります。

 8ビット △◯◯◯◯◯◯◯
16ビット △◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯
32ビット △◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯
64ビット △◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯

ここで三角と丸のところに0か1が入って値を表現しているのですが、先頭が三角になっているのは、このビットは値ではなく、符号として使われることがあるからです(2の補数表現)。

2の補数

一番簡単な8ビットについて説明すると、三角を符号として扱うと、

-128~127

の範囲の値を扱うことが出来ます。ここを符号ではなく値とすれば、

0~255

の範囲になります。

CPUは値を符号付きで扱う命令と符号無しで扱う命令をそれぞれ持っていますが、とちらの解釈をするか決めるのはプログラムのコードなので、プログラムが解釈を間違うと(例えば-1を符号無しで解釈すると255です)値が「化ける」ことがあります。

大部分のプログラミング言語では符号付きで数を扱うのが基本ですが、文字を数値として解釈するなど、異なるサイズの変換を行った際などにも「化ける」ことがあります(ポインタからの変換のときも同様)。

なおC言語などは演算の際のオーバーフローをチェックしていない場合があり、正の数値に正の数値を足していくだけでも、表現できる最大値を超えた段階で負の数になることがあります。ここは数学と異なり、その言語にとって「正しい」動作なのであしからず。


次は小数です。

小数は、浮動小数点という表現方法で2進数の値にします。理科を勉強した時に 2.45×10^3 (^3というところは10の右上に乗っていると解釈してください。以下同様)という書き方を見たことがありませんか。×より前の数字を仮数部、10の右上に付いている数字を指数部と呼び、この2つの数字の組み合わせで小数を表します。CPUで扱う時はすべて2進数で 10110100×2^11 のような表現となります。なお仮数部も指数部も符号付きの値です(厳密には符号部1ビットと符号なし仮数部と符号付き指数部)。

浮動小数点数

一般的には単精度と呼ばれる32ビット(指数部8ビット+仮数部24ビット)か倍精度と呼ばれる64ビット(指数部12ビット+仮数部52ビット)が使われますが、インテルCPUが持っている浮動小数点演算を扱うFPUのレジスタは80ビット(指数部15ビット+仮数部65ビット)あります。今はIEEE 754という規格で統一はされているので、CPUによって、処理系によって、計算結果が異なるということはほとんどありませんが、以前は選択するライブラリによって、微妙に結果が異なることはよくありました(今でもインテルCPUがFPUを使っているかSSEを使っているかで微妙な差がでるかもしれません)。

単精度の場合、仮数部が24ビットですからおよそ10進数で1600万くらいまでが表現できるので、-800万~800万くらいと考えれば、6桁より大きいくらいの精度だと考えれば良いわけです。通常の計算であればこれで充分な気もするのですが、いわゆる誤差にシビアな計算をすることを考えると計算中は倍精度を使ったほうが安心ですね。


さて、文字や文字列については、話が大きく変わるので、次の機会としたいと思います。型の説明をしようとしたら、話が膨らんでしまいました。

ヘッダ画像は以下から使わせていただきました。
https://www.ac-illust.com/main/detail.php?id=1470661&word=%E7%99%BA%E5%85%89%E3%81%99%E3%82%8B0%E3%81%A81%E3%81%AE%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8


この記事が気に入ったらサポートをしてみませんか?