整数の表現

整数の表現z コンピュータは決まったビット幅を単位にデータを扱う．一般に8ビット機なら8ビット単位で，16ビット機なら16ビット単位でデータを扱う．
z nビットの整数表現では 2n 種類の整数しか表現できない．
z 整数は可算無限である．
z コンピュータ上では限られた範囲の整数しか扱えない．

z 整数の表現の例:
z 符号なし表現z 符号つき絶対値表現
z 2の補数表現

九州大学工学部電気情報工学科（2006年度）

符号なし整数表現
z 決められたビット幅 n に，整数 m を2進数に表現したものをそのまま入れる．
z 上位の余ったビットには 0 を補填する．
z 0 以上 2n 未満の整数が表現できる．
z 負の数は表現できない．
z C言語の unsigned int/short/long 型は「符号なし整数表現」．
上位の余った5ビットに0を補填

2004(10)2004(10)を11ビットで表現

0 0 0 0 0 1 1 1 1 1 0 1 0 1 0 0MSB

MSB (Most Significant Bit)→最上位ビット
LSB (Least Significant Bit)→最下位ビット

210292827262422LSB

1024+512+256+128+64+16+4=2004 (10)
九州大学工学部電気情報工学科（2006年度）

符号つき絶対値表現
z 決められたビット幅 n に，整数 m の絶対値を2進数に表現したものをそのまま入れる．
z このとき上位の余ったビットには 0 を補填する．
z 最上位ビットは符号を表す符号ビットとして使用する．m が正な
らば符号ビットは 0，負ならば符号ビットは 1 にする．
z –2n–1 より大きく，2n–1 未満の整数が表せる．
z 0 を表す表現が 000…0 または 100…0 の 2 種類ある．
–2004(10) 1 0 0 0 0 1 1 1 1 1 0 1 0 1 0 0MSB

LSB

符号ビット（0: 正，1: 負）
九州大学工学部電気情報工学科（2006年度）

2の補数表現（１）z 0000…00 から 0111…11 まで（前半）は 0 と正の数に，1000…00 から1111…11 まで（後半）は負の数に使用する．
z 最上位ビットは符号を表す符号ビットとして機能する．m が非負ならば符号ビットは 0，負ならば符号ビットは 1 になる．
z 正の数 m は，決められたビット幅 n に，整数 m を2進数に表現したものをそのまま入れて表現する．このとき上位の余ったビットには0を補填する．
z 負の数 m は，整数 2n + m を2進数で表現したものをそのまま入れて表現する．最上位ビットは常に 1 になる．（たとえば，16ビット表現では， –1 は「65535」として表される．逆に言えば，65535 を –1 に読み替える約束とする．）
z 最上位ビットには –2n–1 の重みがあると考えてもよい．
z –2n–1 以上 2n–1 未満の整数が表現できる．
z C言語の (signed) int/short/long 型は「2の補数表現」．

九州大学工学部電気情報工学科（2006年度）

2の補数表現（２）16ビット表現の場合:
前半
ビット表現

後半

符号なし 補数表現

ビット表現

符号なし 補数表現

0000 0000 0000 0000

00 1111 1111 1111 1111

65535

–10000 0000 0000 0001

11 1111 1111 1111 1110

65534

–20000 0000 0000 0010

22 1111 1111 1111 1101

65533

–30000 0000 0000 0011

33 1111 1111 1111 1100

65532

–40000 0000 0000 0100

44 1111 1111 1111 1011

65531

–50000 0000 0000 0101

55 1111 1111 1111 1010

65530

–60000 0000 0000 0110

66 1111 1111 1111 1001

65529

–7…

…

…

…

…

…

0111 1111 1111 1110

32766

32766 1000 0000 0000 0001

32769

–327670111 1111 1111 1111

32767

32767 1000 0000 0000 0000

32768

–32768

九州大学工学部電気情報工学科（2006年度）

2の補数表現（３）2の補数表現による負数のビット表現の簡単な求め方:① 表現したい負数の絶対値を2進数で表現する．
–5 のビット表現（16ビット）を求める場合，5 の 2 進数は 101．

② 上位ビットに 0 を補填する．
0000 0000 0000 0101

③ ②で得られた2進数の 0 と 1 を反転する．
1111 1111 1111 1010

④ ③で得られた2進数をひとつカウントアップする．
1111 1111 1111 1011

応用問題①: なぜ上記の計算で2の補数表現が正しく得られるのか証明を示せ．
九州大学工学部電気情報工学科（2006年度）

2進表現の比較
3ビット表現の場合:2進表現
10進2の補数表現
符号なし
符号つき
表現 整数表現
絶対値表現
+7111

2進表現
10進2の補数表現
符号なし
符号つき
表現 整数表現
絶対値表現
-0
100
000+6110

-1101

111

+5101-2110

110

+4100

-3111

101+3011

011

011-4+2010010

010-5+1001

001

001-6+0000

000

000

-7

3ビットでは表現できない

100

九州大学工学部電気情報工学科（2006年度）

符号なし整数の加減算
10進数の場合と同様に筆算で加減算できる．
キャリー+)

ボロー–)

1 1 1
10 1 1 1 0 1 1 00 0 1 1 0 1 0 1
1 0 1 0 1 0 1 1118(10)53(10)
171(10)

1 1
10 1 1 0 0 1 1 00 0 0 1 1 1 0 10 1 0 0 1 0 0 1102(10)29(10)
73(10)

九州大学工学部電気情報工学科（2006年度）

2の補数表現の加減算
符号を気にすることなく，符号なし整数の加減算とまったく同じ方法で加減算できる．
→同じ回路で加減算できる!（つまり、符号なし整数用と２の補数用に別々の回路を設ける必要はない）
1 1
キャリー 1 1 10 1 1 0 0 1 1 0
1 1 1 0 0 0 1 1+)0 1 0 0 1 0 0 1102(10)–29(10)73(10)

ボロー

1 1
1
1 10 0 1 1 0 1 1 0
1 1 0 0 1 0 1 1–)
0 1 1 0 1 0 1 154(10)–53(10)107(10)九州大学工学部電気情報工学科（2006年度）

符号拡張（１）ビット幅の異なる2進数を加減算する場合は，短いほうの2進数のビットを長いほうにあわせなければならない．
符号なし整数の場合: そのまま0を補填する．

+)

0 1 1 1 0 1 1 00 0 0 0 0 1 0 1118(10)5(10)

2の補数表現の場合はそのまま0を補填すると問題発生!

+)

0 1 1 1 0 1 1 0
0 0 0 0 1 0 1 1118(10)–5(10) 11(10)九州大学工学部電気情報工学科（2006年度）

符号拡張（２）
符号拡張: 2の補数表現をビット幅を増やすときは，最上位ビットの値を補填する．
正の数の場合:+)0 1 1 1 0 1 1 00 0 0 0 0 1 0 1118(10)5(10)

0 1 1 1 0 1 1 0
1 1 1 1 1 0 1 1118(10)–5(10)

負の数の場合:+)応用問題②: なぜ上記の計算で正しく符号拡張できるのか証明せよ．
九州大学工学部電気情報工学科（2006年度）

論理シフト演算
論理シフト演算: ビットをひとつ左右にずらし，はみ出したビットを捨てて，空いたビットに 0 を補填する．
左シフト:
0 1 1 1 0 1 1 00 1 1 1 0 1 1 0 0118(10)236(10)右シフト:
0 1 1 1 0 1 1 0
0 0 1 1 1 0 1 1 0118(10)59(10)

左シフトは2倍することに，右シフトは2で割ることに相当する．
九州大学工学部電気情報工学科（2006年度）

算術右シフト演算（１）2の補数表現の場合，右シフトが常に2で割ることにはならない．
正の数の場合:0 1 1 1 0 1 1 00 0 1 1 1 0 1 1 0118(10)59(10)

1 1 1 1 0 1 1 00 1 1 1 1 0 1 1 0–10(10)123(10)負の数の場合:九州大学工学部電気情報工学科（2006年度）

算術右シフト演算（２）算術右シフト演算: ビットをひとつ右にずらし，はみ出したビットを捨てて，空いたビットに元の数の最上位ビットの値を補填する．
正の数の場合:0 1 1 1 0 1 1 00 0 1 1 1 0 1 1 0118(10)59(10)

1 1 1 1 0 1 1 0
1 1 1 1 1 0 1 1 0–10(10)–5(10)

負の数の場合:九州大学工学部電気情報工学科（2006年度）

応用問題①解答例
n bit の2の補数表現された任意の正の整数を m とし，そのビット表現を an–1an–2…a0 とする．m は次式で表現される．
m = −2n −1n−2

an −1 + ∑ 2 k ak
k =0

ビット ak を反転したものは (1 – ak) と表現される．m の全ビットを反転し，1 を加えて得られる値 m’ は次式の通り表現され，その値は明らかに –m である．
m′ = −2n −1n−2(1 − an −1 ) + ∑ 2 k (1 − ak ) + 1
k =0= −2n −1+2n −1n−2n−2

an −1 + ∑ 2 − ∑ 2 k ak + 1
kk =0= −2n −1= −(−2+2n −1n −1

an −1 + (2n −1k =0n−2− 1) − ∑ 2 k ak + 1
k =0n−2+ ∑ 2 k ak )k =0= −m
九州大学工学部電気情報工学科（2006年度）

応用問題②解答例
n bit の2の補数表現された任意の整数を m とし，そのビット表現を an–1an–2…a0 とする．
m は次式で表現される．
m = −2n −1n−2an −1 + ∑ 2 k ak
k =0

この整数を n’ bit（n’ > n）に符号拡張して得られる整数 m’ は次式で表現される．
m′ = −2n′ −1n′ − 2n−2

an −1 + ∑ 2 an −1 + ∑ 2 k akkk = n −1k =0m’ – m は以下の通り 0 であり，符号拡張により値が変わらないことが証明される．
m′ − m = an −1 (−2n′ −1n′ − 2+ ∑ 2 k + 2 n −1 )k = n −1= an −1{−2 n′−1 + 2 n −1 (2 n′− n − 1) + 2 n −1}=0
九州大学工学部電気情報工学科（2006年度）

演習問題
10進数「+19」を１）8ビット符号なし整数表現
２）8ビット符号つき絶対値表現
３）8ビット2の補数表現の2進数に変換せよ！
Step1：2進数へ変換
基数

余り

12 19 ・・・
商
9・・・ 122 4 ・・・ 02 2 ・・・ 02 1 ・・・ 1019 (10) = 10011 (2)Step2：各表現へ変換
１）符号なし整数

２）符号つき絶対値

00010011

00010011

３）2の補数

00010011

九州大学工学部電気情報工学科（2006年度）

演習問題
10進数「－19」を
１）8ビット符号つき絶対値表現
２）8ビット2の補数表現の2進数に変換せよ！
Step1：「+19」を2進数へ変換
基数

余り

Step2：各表現へ変換
１）符号つき絶対値 符号

12 19 ・・・
0 0 0 1 0 0 1 1 設定
商
2 9 ・・・ 12 4 ・・・ 010010011
2 2 ・・・ 0
絶対値
符号2 1 ・・・ 1（19）（－）
019 (10) = 10011 (2)２）2の補数

00010011

反転

1 1 1 0 1 1 0 0 +111101101

九州大学工学部電気情報工学科（2006年度）

演習問題
10進数「+42」を
１）16ビット符号なし整数表現
２）16ビット符号つき絶対値表現
３）16ビット2の補数表現の2進数に変換せよ！
Step1：2進数へ変換
基数

余り

Step2：各表現へ変換

02 42 ・・・
商
21・・・ 122 10 ・・・ 02 5 ・・・ 12 2 ・・・ 02 1 ・・・ 1042 (10) = 101010 (2)１）符号なし整数

0000000000101010
２）符号つき絶対値

0000000000101010
３）2の補数

0000000000101010
九州大学工学部電気情報工学科（2006年度）

演習問題
10進数「－42」を１）16ビット符号つき絶対値表現
２）16ビット2の補数表現の2進数に変換せよ！
Step2：各表現へ変換
１）符号つき絶対値

Step1：2進数へ変換
基数

余り

02 42 ・・・
商21・・・ 122 10 ・・・ 02 5 ・・・ 12 2 ・・・ 02 1 ・・・ 1042 (10) = 101010 (2)0000000000101010

符号設定1000000000101010
２） 2の補数0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 反転
1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 +1
1111111111010110
九州大学工学部電気情報工学科（2006年度）