9.2. 二進法#
9.2.1. 10進数と2進数#
10進数 |
2進数 |
---|---|
0 |
0 |
1 |
1 |
2 |
10 |
3 |
11 |
4 |
100 |
5 |
101 |
6 |
110 |
7 |
111 |
8 |
1000 |
9 |
1001 |
アルゴリズム
与えられた値を2で割った商と余りを求める。
商が0になるまで繰り返す。
商が0になったら、余りを逆順に並べる。
9.2.1.1. Example: 101101の10進数を求める#
9.2.1.2. Example: 13の2進数を求める#
13を2で割ると、商6、余り1
6を2で割ると、商3、余り0
3を2で割ると、商1、余り1
1を2で割ると、商0、余り1
商が0になったので、余りを逆順に並べる。
13の2進数は1101である。
9.2.2. 2進加算#
9.2.3. 2の補数記法#
2の補数(two’s complement)記法は、コンピュータで整数を表現する最も一般的な体系である。
長さ3のパターン
ビットパターン |
表現する値 |
---|---|
011 |
3 |
010 |
2 |
001 |
1 |
000 |
0 |
111 |
-1 |
110 |
-2 |
101 |
-3 |
100 |
-4 |
最左端のビットが符号を表す。符号ビットと呼ぶ。
絶対値が同じである正負の値を表現するビットパターンの間に簡潔な関係がある。
右から読んでいくと、最初の1が現れるまでのビットが同一である。
その1から右のビットは、お互いに補な関係がある。
9.2.3.1. Example: 1010を解読する#
1010の符号ビットは1なので、負の数である。
1010を正の数に変換すると、0110である。
0110の値は6である。
1010は-6を表す。
9.2.3.2. 2の補数記法による加算#
2の補数記法による加算は、解も含めて全てのビットパターンが同じ長さである。
2の補数記法による加算は、通常の加算と同じように行い、左端に生成される余分なビットを切り捨てる。
9.2.3.2.1. Example: 0101 + 0010#
9.2.3.2.2. Example: 0111 + 1011#
0111 + 1011 = 10010 であるが、最左端のビットを切り捨てる。
9.2.3.3. 2の補数記法による減算#
7の2の補数を求める。
5の2の補数を求める。
9.2.3.4. オーバーフロー#
9.2.3.4.1. やってみよう#
#include <stdio.h>
int main() {
char a = 127;
char b = 1;
char c = a + b;
printf("a = %d, b = %d\n", a, b);
printf("a + b = %d\n", c);
return 0;
}
char
型は8ビットで表現され、最大値は127であり、最小値は-128である。問題char
型の範囲を超え、
9.2.3.4.2. 2038年問題#
9.2.3.5. 16進記法#
ビットパターン |
16進数 |
---|---|
0000 |
0 |
0001 |
1 |
0010 |
2 |
0011 |
3 |
0100 |
4 |
0101 |
5 |
0110 |
6 |
0111 |
7 |
1000 |
8 |
1001 |
9 |
1010 |
A |
1011 |
B |
1100 |
C |
1101 |
D |
1110 |
E |
1111 |
F |
16進記法では、4ビットのパターンを1つの記号で表現できる。
9.2.3.5.1. Example: 2進数を16進数に変換する#
9.2.4. 小数#
9.2.4.1. 浮動小数点記法#
符号ビット
指数部
仮数部
9.2.5. 練習問題#
次のビットパターンを16進記法で表現せよ。
0101 1010
1100 0011 1010
1111 0001 0100 1001
次の16進数をビットパターンで表現せよ。
610A
ABCD
5F3A
0100
のとき、次の論理式の値を求めよ。次の10進数を2進数に変換せよ。
32
64
15
27
次の2進数を10進数に変換せよ。
101010
100011
0110
11111
次の2進数の和を求めよ。
101 + 110
1101 + 1011
10101 + 11011
101010 + 11011
9.2.5.1. 2の補数#
次の2の補数表現を、それぞれ等しい10進数に変換せよ。
00011
01111
11100
11010
00000
10000
次の10進数をそれぞれ等しい8ビットパターンの2の補数表現に変換せよ。
6
-6
-17
13
-1
0