第四回-03 C/C++ で正負の整数を確認
前ページまでで、コンピュータの内部では数値は 2 進数で表現されていること、
そして、ある 2 進数の 0 と 1 のパターンが、「0を含む正の整数と解釈した場合」と「負の整数と解釈した場合」とで異なる値になることがあることを学んだ。
それを C/C++ で確認してみよう。
さて、前ページでは 2進数を以下の二つにわけて考えた
- 0 を含む正の整数を表現する2進数
- 負の数を含む整数を表現する2進数
プログラミングの世界では、それぞれに対して以下の名前が付いている。
- 0 を含む正の整数を表現する2進数:符号なし整数
0, 1の並びの中にプラス マイナスを表す符号がない、すなわち負の数がないということ
- 負の数を含む整数を表現する2進数:符号つき整数
0, 1の並びの中にプラス マイナスを表す符号がある、すなわち負の数があるということ。
「0を含む正の整数のみの場合と負の整数を含む場合との比較」で述べたように MSB が符号に対応する。
さて、今日の演習で用いる変数は整数を表す int 型である。
通常の PC では、 int 型の整数は 32 ビットの符号つき整数である。
32 ビットというのは、前ページまでに取り扱ってきた 4 ビットや 8 ビットに比べ、かなり桁が多い。
それでは少し演習が難しくなるので、ビット数を減らしたいときに使える型修飾子を紹介する。
int 型や double 型などの変数を宣言する際、型の前に型修飾子と呼ばれる以下のものをつけることができる。
- signed : 符号つき数
- unsigned : 符号なし数
- short : 短いビット数を用いる
- long : 長いビット数を用いる
まず、signed と unsigned は、変数が符号つき (signed、サインド) か符号なし (unsigned、アンサインド) かを指定するためのものである。
使用例は以下の通り。
signed int i; // 符号つき整数型の変数 i の宣言
unsigned int j; // 符号なし整数型の変数 j の宣言
通常のPC の場合、signed は省略できる。
すなわち、以下のようにも書ける。
int i; // signed int i; と同じ
これまで int 型の整数を何度も宣言してきたが、
それは実は符号つき (正負あり) 整数である singed int の変数を宣言していた、ということである。
また、型修飾子 short や long を int などの前につけると、変数のビット数を指定することができる。
int 型の場合、short をつけると 16ビットになり、long をつけると 32 ビットとなる。
本日の演習の場合、ビット数を小さくしたいので、short をつけて 16 ビットの 2 進数を取り扱う。
short int i; // 16ビットの符号つき整数型の変数 i の宣言
unsigned short int j; // 16ビットの符号なし整数型の変数 j の宣言
さて、16 ビットの 2 進数により表現される 10 進数の範囲はわかるだろうか?
前ページに以下の内容が書かれていたことを思い出そう。
- n ビットの2進数で0を含む正の整数を表現すると、0 ~ 2n -1 の 2n 通りの数値を表現でき、
負の数を含む整数を表現する場合は -2n-1 ~ 2n-1 - 1 の 2n 通りとなる。
これにもとづけば、16ビットの 2 進数で表現できるのは、以下の範囲の 10 進数である。
- 符号なし整数の場合: 0~65535 の 65536 通り (216 = 65536 に注意)
- 符号つき整数の場合: -32768~32767 の 65536 通り
さて、型修飾子によってビット数を指定できることがわかった。
型のビット数を確かめるには、sizeof 演算子を用いると良い。
sizeof(short int)
sizeof(unsigned short int)
結果はバイト単位で得られる。1 バイト = 8 ビットであるので、結果をビットで表示したければ、結果に8 をかければ良い。
cout << "short int 型のビット数は" << 8*sizeof(short int) << "ビットです\n";
cout << "unsigned short int 型のビット数は" << 8*sizeof(unsigned short int) << "ビットです\n";
さて、以上の予備知識のもと、本日の演習を行うために必要なプログラムは以下のようになる。
paiza.IO の適切な位置に貼り付けて実行してみよう。「適切な位置」が分からない学生は第一回3ページ目を復習すること。
short int i; // 16ビットの符号つき整数型の変数 i の宣言
unsigned short int j; // 16ビットの符号なし整数型の変数 j の宣言
// ビット数を表示
cout << "short int 型のビット数は" << 8*sizeof(short int) << "ビットです\n";
cout << "unsigned short int 型のビット数は" << 8*sizeof(unsigned short int) << "ビットです\n";
// 変数に値を代入
i = -120;
j = 65528;
// 変数の中身を表示
cout << "符号つき整数 i の値は" << i << "です\n";
cout << "符号なし整数 j の値は" << j << "です\n";
実行すると、結果に以下の内容が表示されるはずである。確認したら、課題に進もう。
short int 型のビット数は16ビットです
unsigned short int 型のビット数は16ビットです
符号つき整数 i の値は-120です
符号なし整数 j の値は65528です
←コンピュータ上の数値の表現 (2) 負の数を含む整数の2進数による表現~2の補数表現
/
課題→
オンラインコンパイラで C/C++ を自習しように戻る