1の補数
読み:いちのほすう
外語:one's complement

 2進数における負の数の表わし方の一つで、すべてのビットを反転させたもののこと。つまり、正数表現に対し、単純に論理否定を取ったものである。
目次

概要
 ネットワークチェックサムと呼ばれる、IPTCPUDPを始めとする各種プロトコルのチェックサム計算用に使われている。
 IP、TCP、UDPは「1の補数和の1の補数」が使われている。
 ここで2の補数でなく1の補数なのは、バイトオーダーを気にせず計算できる利点があるためで、後者で最後に結果を否定して1の補数にしているのは、パケット全体を1の補数和した時に結果が0になり計算しやすいからである。

特徴

マイナス1
 例えば-1を例にする。16進数4桁で+1は0x0001なので、これを論理否定すると0xFFFEとなる。
 つまり1の補数の世界では0xFFFEが-1を意味することになる。

マイナス0
 1の補数の世界では、+0の否定として-0が存在する点も重要である。
 16進数4桁で0は0x0000なので、これを否定すると0xFFFFとなる。+0も-0も同じ値と考えれば、0の表現に0x0000と0xFFFFの二つが存在するということになる。
 計算する場合の盲点となりがちなので注意が必要である。

1の補数和
 1の補数の加算は1の補数和と呼ばれ、左の桁への桁上がりを一番右に足し込むことで行なう。
 一例として0xFFFFと0x1234の和(1の補数和)を考える。0xFFFF+0x1234→0x11233となるが、16ビットを超えた部分を右側に加算するので、結果は0x1234となり、元と値は変わらない。なぜなら1の補数の世界では0xFFFFは0を意味するからである。
 1の補数の世界では-2(0xFFFD)、-1(0xFFFE)、-0(0xFFFF)、+0(0x0000)、+1(0x0001)、+2(0x0002)…のようになるため、0xFFFFに1足して桁上がりした場合、0x0000(つまり+0)を経由する必要はなく、0x0001になるべきである。そのために、桁上がりの桁を右側に足し込むことになる。

再検索