コンテンツにスキップ

2の補数

出典: フリー百科事典『ウィキペディア(Wikipedia)』

2: two's complement2 [1][2][3][4][5][6][ 1] x 2 2n xc= 2n  x[ 3]24 = 16 5 2 11 = 16  5

 x2 xc2 xc x n+ 1 24 = 100002 = (1111 + 1)2 [ 2]510 = 01012 2 1110= 10112 = (1111  0101 + 1)2

21 11 0  1 1 0 0101  101021

2#  n 0  2n1  1n = 8  0  1272: two's complement representation2: two's complement notation#2

2

2使

[]


#2

[]


4 00102 (= 2) 2 11102 

 100002 = 24 = 16 11102  00102  100002 54 00002 00102 2 11102  0010  0010  11102  2 

[]


 01012 (= 5)  00112 (= 3) 

一方、二進数 00112 の2の補数 11012 を足す計算は、以下のようになる:


54 00102 (= 2) 11012  3 

[]




 01012 (= 5)  00112 (= 3) 

結果は 10002 となるが、これは2の補数表現において負の整数 −8 に対応し、通常の足し算で期待される結果 5 + 3 = 8 と一致しない。

同様に、二進数 11012 (= −3) と二進数 10102 (= −6) の足し算は期待する結果を与えない:

結果は 01112 (= 7) となり、通常の足し算で期待される結果 (−3) + (−6) = −9 と一致しない。

負の数の表現[編集]

2の補数を用いて、二進法で表された数(二進数)を整数に対応づけられる。2の補数の定義より、n[注 4]の二進数 x とその補数 xc は以下の関係を満たす[7]

2n倍数0 と同一視すれば、上記の補数の関係は 2n を法とする合同式に置き換えられる[8]

これは x の補数 xcx反数 x と見なすことを意味する。すなわち、数 y から x を引く操作は、数 y と補数 xcたし算に置き換えられる[9][10]

同様に反数 xかけ算は補数の積に置き換えられる[10]

2の補数表現[編集]

#負の数の表現節の方法で負の数の計算を行えるが、具体的な数値計算を行うには、どの二進数ビット列)がどの数値を表すかという対応関係を定義しなければならない。0 から 2n−1 − 1 までの非負整数をそのまま通常の位取り記数法における二進表示、

に対応づければ、これらの数の補数として整数に対する2の補数表現が得られる:

具体例として、n = 4[注 4]の二進数における対応表を示す:

24 についての2の補数表現における、二進数(ビット列)と対応する数値の一覧
対応する数値 二進数 対応する数値 二進数
0 00002 - -
1 00012 −1 11112
2 00102 −2 11102
3 00112 −3 11012
4 01002 −4 11002
5 01012 −5 10112
6 01102 −6 10102
7 01112 −7 10012
- - −8 10002

結局、n 桁の二進数の k + 1 桁目の値を bk ∈ {0, 1} とすれば、2の補数表現は以下のように表せる[11]

最上位ビット bn−1符号ビットふごうビット: sign bit)と呼ばれ、数値の正負を決定する。すなわち、符号ビットが 0 なら非負の数値を表し、1 なら負の数値を表す。

上記の数の補数は、以下のように表せる:

等比数列の和 を用いれば、上記の補数は以下のようにも表せる[11]


 2n1 2n1 [ 5]

2[]

[]


2 0 [14]1

[]


2n n  2n1  +(2n1  1) [14] n= 8 27 = 128  +(27  1) = +127 111 (2n1  1)  +(2n1  1) 

[]


2 b0  0  1[14]1 1 1 0  0 

[]


2 bn1  0  1[14]1 0  +0  1 0 0 

1[]


21  1 111...112  x[ 6] fx

上記より、x の2の補数は xc = fx + 1 と表せる。従って減法は、

と書き換えられる。ビット反転はまた1の補数を得る操作でもある。


 (2n  1)  x x11

[]


x  n m 1  0 2 fx+ 1  M= min(m, n)[ 7]2 n M fx n Mx = 0100  fx= 1011 2 fx+ 1 = 1100 1000  0000  0111, 1111 2 1000, 0000 
24 についての2の補数表現における、補数と元の数との下位ビットの一致[注 8]
元の数と一致する下位ビットの桁数(M 1 2 3 4 4
元の数(x B3B2B11 B3B210 B3100 1000 0000
ビット反転(fx B3B2B10 B3B201 B3011 0111 1111
2の補数(fx + 1 B3B2B11 B3B210 B3100 1000 0000

脚注[編集]

注釈[編集]



(一)^ 12#

(二)^ ab

(三)^  xc xc(01112)c = 10012[ 2]c complement 

(四)^ ab n 0  n 0001 4

(五)^ Java java.lang.Math.abs(int) [12][13]CC++2INT_MIN-INT_MIN INT32-C 

(六)^  0  1 1 0 

(七)^ min 

(八)^  BB  B2

出典[編集]

  1. ^ JIS X 0005:2002 2002, 05.08.04 2の補数.
  2. ^ ISO/IEC 2382:2015 2015, 2. Terms and definition. 2121100. twos complement.
  3. ^ JIS X 0005:2002 2002, 05.08.02 基数の補数.
  4. ^ ISO/IEC 2382:2015 2015, 2. Terms and definition. 2121098. radix complement.
  5. ^ JIS X 0005:2002 2002, 05.08.01 補数.
  6. ^ ISO/IEC 2382:2015 2015, 2. Terms and definition. 2121097. complement.
  7. ^ 水谷『数の補数表現』, pp. 2–3, 2.2 符号ビットと 2 の補数.
  8. ^ 西村『論理(スイッチング)回路と計算』, p. 14, 2の補数表現でなぜうまく行くのか?.
  9. ^ 水谷『数の補数表現』, p. 2, 2.1 補数.
  10. ^ a b 中野『代数入門』, p. 18, 5.1 合同式, 命題5.2.
  11. ^ a b 水谷『数の補数表現』, p. 3, 2.2 符号ビットと 2 の補数.
  12. ^ Java SE & JDK API Specification, java.lang.Math#abs(int).
  13. ^ Java Language Specification, 4.2.2. Integer Operations.
  14. ^ a b c d 西村『論理(スイッチング)回路と計算』, p. 18, 2の補数表現の性質.

[]


 JIS X 0005:2002 2002831 

ISO; IEC, eds (2015-05). ISO/IEC 2382:2015 Information technology  Vocabulary. ISO/IEC 

IBM, ed (1964-01-01). IBM System/360 Principles of Operation. IBM. doi:10.5555/1102026. https://dl.acm.org/doi/10.5555/1102026 

, . "  " (PDF). www.edu.tuis.ac.jp/~mackin. 2023511

西, . "  " (PDF). www.math.kyoto-u.ac.jp/~susumu. 2023511

,  (1 April 2022). "" (PDF). pc1.math.gakushuin.ac.jp/~shin. 2023511

Seacord, Robert. "CERT C Coding Standard: INT32-C. Ensure that operations on signed integers do not result in overflow". wiki.sei.cmu.edu. 2023513

"CERT C : INT32-C. ". www.jpcert.or.jp/sc-rules/. JPCERT/CC. 16 June 2020. 2023514

"Chapter 4. Types, Values, and Variables  Java Language Specification". docs.oracle.com/javase/specs/jls/. Oracle. 3 March 2023. 2023513

"Class Math  Java SE 20 & JDK 20". docs.oracle.com/en/java/javase/20/docs/api/. Oracle. 2023513

[]








1