Skip to content

2の補数計算機 — 符号付き整数エンコーディング変換

符号付き10進数を入力すると、符号絶対値表現・1の補数・2の補数・ゲタばき表現を4〜64ビットで同時に算出します。ビット列や16進バイトを貼り付ければ、同じパターンの5通りの読み方を並べて確認できます。8ビットの−128に符号絶対値表現と1の補数が存在しないことも明示。すべてブラウザ内で処理、無料、登録不要。

トラッキングなし ブラウザで動作 無料
すべての計算はお使いのブラウザ内で行われます。入力した内容がアップロードされることはありません。
ビット幅

10進数からマシン表現へ

符号付きの整数を入力してください。4 つの表現が同時に計算されるので、自分のシステムがどれを使っているかを前もって知っている必要はありません。

試してみる
エンコーディング ビット列 16進数
符号絶対値表現 1000 0101 85
1の補数 1111 1010 FA
2の補数 1111 1011 FB
ゲタばき表現 0111 1011 7B

ビット列から値へ

メモリダンプやレジスタで見つけた 1 バイトを、どう読むべきか分からない。貼り付ければ、各解釈でそれが何を意味するかが一度に並びます。どれが正しいかは作った側のシステム次第なので、すべて表示します。

読み方
符号なし 251
符号絶対値表現 -123
1の補数 -4
2の補数 -5
ゲタばき表現 123
8ビット対照表

上のツールと同じエンジンで計算しているので、両者の値がずれることはありません。

10進数 符号絶対値表現 1の補数 2の補数 ゲタばき表現 16進数
127 0111 1111 0111 1111 0111 1111 1111 1111 7F
100 0110 0100 0110 0100 0110 0100 1110 0100 64
10 0000 1010 0000 1010 0000 1010 1000 1010 0A
5 0000 0101 0000 0101 0000 0101 1000 0101 05
1 0000 0001 0000 0001 0000 0001 1000 0001 01
0 0000 0000 0000 0000 0000 0000 1000 0000 00
-1 1000 0001 1111 1110 1111 1111 0111 1111 FF
-5 1000 0101 1111 1010 1111 1011 0111 1011 FB
-10 1000 1010 1111 0101 1111 0110 0111 0110 F6
-100 1110 0100 1001 1011 1001 1100 0001 1100 9C
-127 1111 1111 1000 0000 1000 0001 0000 0001 81
-128 1000 0000 0000 0000 80
ビット幅ごとの値の範囲
ビット幅 2の補数 / ゲタばき表現 符号絶対値表現 / 1の補数
4 -8 … 7 -7 … 7
8 -128 … 127 -127 … 127
16 -32768 … 32767 -32767 … 32767
32 -2147483648 … 2147483647 -2147483647 … 2147483647
64 -9223372036854775808 … 9223372036854775807 -9223372036854775807 … 9223372036854775807
5 種類のビット幅すべてについて、各エンコーディングをテストスイートで検証しています。4 ビットの全範囲、2 つのゼロのパターン、各幅の最小値を含みます。64 ビットの結果は JavaScript 自身の BigInt.asIntN と BigInt.asUintN で相互検証しています。 — Go Tools チーム · Sep 9, 2026

Go Tools エンジニアリングチームが構築し、検証しています。

早わかり回答

8ビットの2の補数で −5 は?

11111011 11111011、16 進では 0xFB です。

符号付きバイトの範囲は?

-128 … 127 2 の補数では −128 から 127、符号絶対値表現と 1 の補数では −127 から 127 です。

2の補数のパターンを数に戻すには?

符号なし値 − 2^n 最上位ビットが 0 なら符号なしとして読み、1 なら符号なしの読みから 2^n を引きます。

0xFF は −1 ですか、255 ですか?

−1 か 255 符号付きバイトなら −1、符号なしなら 255 です。ビットだけでは決まりません。

2の補数とは?

2 の補数が答えているのは数学の問題ではなく、ハードウェアの問題です。すでに作ってしまった加算器をそのまま使い続けられるように、負の数をどう格納するか。答えは −x2^n − x のパターンで表すことでした。加算は 2^n を法として自然に回り込み、符号の特別扱いなしに正しい答えへ着地します。だから減算のために別の回路を作る必要がありません。

ここから 2 つの帰結が出て、どちらも実際のバグとして現れます。第一に、範囲が非対称です。8 ビットが覆うのは −128 から 127 であって −128 から 128 ではありません。パターンの総数を分け合う必要があり、両側を揃えてくれる負のゼロが存在しないからです。第二に、符号は取り外せる旗印ではありません。11111011 の最上位ビットは 1 ですが、値は −123 ではなく −5 です。負の数を読むとは 1 ビットを見ることではなく、ワード全体を解釈することです。

符号絶対値表現と 1 の補数は、競争に敗れた 2 つの設計です。それでも知っておく価値があるのは、IEEE 754 の浮動小数点数が符号絶対値表現のレイアウトを受け継いだこと、そして 3 つを並べて比べて初めて、2 の補数が恣意的な選択ではなく必然に見えてくるからです。

// -5 as an 8-bit byte, three ways to arrive at the same pattern
0b00000101        // 5
~0b00000101       // 11111010  ones' complement of 5
~0b00000101 + 1   // 11111011  two's complement = -5

// In JavaScript the width matters: bitwise operators are 32-bit,
// so anything wider has to go through BigInt.
BigInt.asIntN(8, 0xFBn)                 // -5n
BigInt.asUintN(8, -5n)                  // 251n
BigInt.asIntN(64, 0xFFFFFFFFFFFFFFFBn)  // -5n

// C23 made two's complement mandatory for signed integers.
// Before that, the other two encodings were legal but unused.

この計算機でできること

4つのエンコーディングを同時に

符号絶対値表現、1 の補数、2 の補数、ゲタばき表現をまとめて計算します。ゲタばき表現は多くの計算機が省くものですが、ADC のデータシートが今も使い続けているのはこれです。

ビットパターンからの逆引き

手元にある実際のビット列や 16 進を貼り付ければ、符号なしを含む 5 通りの読み方が出ます。ダンプと機器の表示が食い違うときに必要なのは、この方向です。

64ビットでも正しい

すべての値を BigInt で扱うため、0xFFFFFFFFFFFFFF9C は 32 ビット切り捨ての産物ではなく −100 になります。

表現できないものは表現なしと書く

ビット幅 8 の −128 には、符号絶対値表現も 1 の補数の形もありません。表にはそう書きます。その数を意味しないパターンを印字したりはしません。

負のゼロを見えるようにする

0 を入力すると、符号絶対値表現と 1 の補数におけるゼロの 2 つ目のビットパターンが表示されます。2 の補数が勝った理由を示す、いちばん分かりやすい一点です。

JavaScriptなしで読める参照表

8 ビット対照表とビット幅ごとの範囲は、上の入力欄を動かすのと同じエンジンでビルド時に描画されます。だから両者がずれることはありません。

他の確認方法との比較

言語標準の変換関数

ランタイム API

BigInt.asIntN、Python の int.from_bytes(..., signed=True)、C の固定幅型は、いま書いているコードにとって権威ある答えを返します。コードの中ではそれらを使い、値が目の前にあってインタプリタを開いていないときに、このページを使ってください。

デバッガのメモリビュー

IDE の機能

プログラムが宣言した型で値を表示します。それはビットパターンに欠けている、まさにその情報です。ただし型の宣言なしに回線から届いたバイトには使えません。このページが引き受けるのは、その場合です。

進数変換ツール

当サイト

基数どうしを変換しますが、扱えるのは非負の値だけです。負の数はあちらでは明示的に拒否されます。基数そのものは、符号をどう格納するかについて何も主張しないからです。符号付き表現はこのページの仕事で、絶対値の基数変換はあちらの仕事です。

浮動小数点側の対応ツールです。2 の補数ではなく符号絶対値表現のレイアウトを保ち、指数部には 2^(e−1)−1 のバイアスがかかります。つまり 2 つのページは、同じメモリ 1 ワードについて別々の問いに答えています。

計算例

−5 を 1 バイトに入れる

-5、ビット幅 8
符号絶対値表現  1000 0101
1の補数        1111 1010
2の補数        1111 1011  (0xFB)
ゲタばき表現    0111 1011

3 つのエンコーディングは符号ビットだけ一致し、それ以外はすべて食い違います。C の int8_t が実際に保持しているのは 2 の補数の行だけです。

同じバイト 0xFB の 5 通りの読み方

0xFB、ビット幅 8
符号なし        251
符号絶対値表現  -123
1の補数        -4
2の補数        -5
ゲタばき表現    123

−128 には符号絶対値表現がない

-128、ビット幅 8
符号絶対値表現  この幅では表現なし
1の補数        この幅では表現なし
2の補数        1000 0000  (0x80)
ゲタばき表現    0000 0000

符号絶対値表現と 1 の補数はどちらも負のゼロにビットパターンを 1 つ使うため、範囲は −127 から 127 で −128 には届きません。ここでバイトを表示するツールは間違っています。

64 ビットレジスタの値

0xFFFFFFFFFFFFFF9C、ビット幅 64
2の補数    -100
符号なし   18446744073709551516

32 ビットを超えるものは BigInt で扱うほかありません。JavaScript の |<<>>> は黙って 32 ビットに切り詰めます。一部のオンライン計算機がここでエラーではなく誤った答えを返すのは、そのためです。

2の補数計算機の使い方

  1. 1

    ビット幅を選ぶ

    4、8、16、32、64 のいずれか。これは表示の好みではありません。同じビットでも幅が違えば別の数を意味するので、選び間違えると答えそのものが変わります。

  2. 2

    符号付き10進数を入力する

    マイナス符号も含めて整数を入力してください。4 つのエンコーディングが入力に合わせて更新され、それぞれの 16 進表記も同時に出ます。

  3. 3

    またはビットから逆にたどる

    2 進文字列か 0x 付きの値を逆引きフィールドに貼り付けると、そのパターンが各解釈でどんな数になるかが、符号なしの読み方も含めて分かります。

  4. 4

    注記が出たら読む

    つまずきやすい 2 点をページが知らせます。最小値には符号絶対値表現と 1 の補数の形が存在しないこと、そしてその 2 つではゼロに 2 つ目のビットパターンがあることです。

誤った答えを生む間違い

+1 を忘れる

ビットを反転しただけでは 1 の補数です。そこで止めると 2 の補数から 1 ずれますが、結果はもっともらしい負の数に見えるため気づきにくい間違いです。

✗ 誤り
5   = 00000101
~5  = 11111010   <- ones' complement, not -5
✓ 正しい
5        = 00000101
~5       = 11111010
~5 + 1   = 11111011   <- -5 in two's complement

64ビットの値に32ビットのビット演算子を使う

JavaScript はビット演算子のオペランドを 32 ビットに切り詰めます。上半分はエラーなしで消えるため、結果は「出ない」のではなく「間違っている」状態になります。

✗ 誤り
0xFFFFFFFFFFFFFFFB        // 18446744073709552000  -- the literal is already rounded
~0xFFFFFFFFFFFFFFFB + 1   // 0  -- silently wrong, expected -5
✓ 正しい
BigInt.asIntN(64, 0xFFFFFFFFFFFFFFFBn)   // -5n

負の値をゼロ拡張する

ゼロで埋めて幅を広げても数が保たれるのは、正のときだけです。負の値では、増えたビットすべてに符号ビットを複製する必要があります。

✗ 誤り
int8  0xFB  (-5)
int16 0x00FB  (251)   <- zero-extended
✓ 正しい
int8  0xFB  (-5)
int16 0xFFFB  (-5)    <- sign-extended

最小値に符号絶対値表現を与える

8 ビットの −128 には、符号絶対値表現も 1 の補数の表現もありません。どちらのエンコーディングも負のゼロにパターンを 1 つ使うからです。ここに 10000000 と印字するのは、2 の補数の答えを、その数を表せないエンコーディングと取り違えています。

✗ 誤り
-128 sign-magnitude: 10000000   <- that pattern means -0
✓ 正しい
-128 sign-magnitude: no representation at width 8
-128 two's complement: 10000000

実際に必要になる場面

センサーレジスタを読む
温度レジスタが 0xFF9C を返します。符号なしなら 65436 で、これは温度ではありません。ビット幅 16 の 2 の補数の行は −100 を示し、0.1 °C のスケール係数と合わせれば、センサーが言っているのは −10.0 °C です。
型情報のないプロトコルのデバッグ
Modbus、CAN、そして多くのバイナリテレメトリは、符号の情報を持たない生のワードを運びます。クライアントと機器の値が食い違うとき、同じワードの両方の読み方を突き合わせれば、たいていどちら側の思い込みが誤りだったか分かります。
計算機アーキテクチャの課題
符号絶対値表現、1 の補数、2 の補数、ゲタばき表現は、入門講義の定番の 4 つです。同じビット幅で並べれば、違いは暗記するものではなく見えるものになります。
整数オーバーフローを追う
カウンタが 2147483647 から −2147483648 へ飛んだとき、両方を 32 ビットのパターンで見れば、桁上げが符号ビットに入ったことが分かります。値が意味不明になったのではなく、エンコーディングの規則どおりに回り込んだだけです。
シリアライズ処理を書く
手書きのエンコーダを信用する前に、各ビット幅で負の値を 1 つずつこのページと照合してください。符号の扱いは書き間違えやすく、しかも最初の本物の負の数が来るまで、出力は構造的に問題なく見えてしまいます。

4つのエンコーディングの作り方

符号絶対値表現
最上位ビットが符号で、残りの n−1 ビットが絶対値を普通の符号なし数として表します。範囲は −(2^(n−1)−1) から 2^(n−1)−1 で対称、ゼロは 2 つ。IEEE 754 の浮動小数点数が使っているのが、このレイアウトです。
1の補数
負の値はその絶対値のビット反転、すなわち 2^n − 1 − x です。範囲も 2 つのゼロも符号絶対値表現と同じ。加算にはエンドアラウンドキャリー(巡回桁上げ)が必要で、まさにそれが 2 の補数の取り除いた面倒です。英語表記でアポストロフィの位置が違うのは誤植ではありません。ones' complement は全ビット 1 のワードを基準にし、two's complement は 2 のべき乗 1 つを基準にします。
2の補数
負の値 −x2^n − x として格納されます。範囲は −2^(n−1) から 2^(n−1)−1、意図的に非対称で、ゼロは 1 つ。加算・減算、そして下位ワードの乗算はすべて符号に依存せず、これが勝因のすべてです。
ゲタばき表現
value + 2^(n−1) を格納するので −2^(n−1) が全 0 になり、パターンの並び順が、それが表す値の順序と一致します。2 の補数のパターンの最上位ビットを反転したものに等しいです。名前には注意してください。IEEE 754 の指数部は 2^(e−1)−1 でバイアスされており、ここで使うオフセットより 1 小さい値です。
なぜ計算にBigIntを使うのか
JavaScript は &|~ とシフトのオペランドを 32 ビット整数に変換してから演算し、終わってから戻します。そのため 64 ビットの値は、何のエラーも出さずに上半分を失います。このページの変換はすべて任意精度整数の上で行うので、64 ビットの両端も正確に出ます。

符号付きの値を正しく扱うために

何よりも先にビット幅を決める
フィールドの幅を言うまで、ビットパターンには値がありません。データシートとデバッガの食い違いは、たいてい片方が 16 ビット、もう片方が 32 ビットを仮定していたという話に落ち着きます。
最小値は特別扱いする
どのビット幅でも符号反転はあふれます。2 の補数の符号付きバイトでは −(−128) はやはり −128 のままです。絶対値を計算するコードにはこの入力への方針が要りますし、テストにも必ず含めるべきです。
符号の有無をデータから推測しない
ビットをいくら眺めても、そのフィールドが符号付きかどうかは分かりません。データシート、スキーマ、構造体定義から取ってください。当てずっぽうは、本番に最初の負の値が来るまでは通用します。
幅を広げるときは符号拡張する
8 ビットの 0xFB を 16 ビットのフィールドに 0x00FB として写すと、−5 が 251 になります。符号付きの値を広げるとは符号ビットを複製することで、正しくは 0xFFFB です。
言語標準の変換を優先する
JavaScript の BigInt.asIntN、Python の int.from_bytes(..., signed=True)、C の固定幅型は、意図を明示していて境界も処理してくれます。手書きの ~x + 1 こそが、ビット幅バグの発生源です。

よくある質問

2の補数とは何か、一文で言うと?
負の数 −x2^n − x のビットパターンで格納する取り決めのことです。これにより加算と減算が同じ回路で済み、数直線上のゼロがちょうど 1 つになります。
2の補数を手計算で求める手順は?
絶対値を 2 進数で書き、全ビットを反転し、1 を足します。8 ビットの 5 なら 000001011111101011111011。反転だけで止めたものが 1 の補数で、だから両者は常に 1 だけ離れています。
符号付きバイトに −128 は入るのに +128 が入らないのはなぜ?
2 の補数の範囲は意図的に非対称です。n ビットで −2^(n−1) から 2^(n−1)−1 までを覆います。符号絶対値表現や 1 の補数のように負のゼロへパターンを 1 つ浪費しないので、その余った 1 枠が負の側に落ちるからです。
11111011 は −5 ですか、それとも 251 ですか?
どちらでもあり、ビットだけでは決まりません。答えはそれを作った側が宣言した型で決まります。だからこのページの逆引きは 1 つを選ばず、すべての読み方を同時に並べます。手元の int8_tuint8_t に合う行を選んでください。
ゲタばき表現とは何で、どこで出会いますか?
ゲタばき表現(オフセットバイナリ、バイアス表現)は value + 2^(n−1) を格納します。最小値が全 0 になり、生のパターンを符号なし整数として並べた順序が、符号付きの値の順序と一致します。ADC や DAC の出力、音声のサンプル形式に現れます。なお IEEE 754 の指数部のバイアスは 2^(e−1)−1 で 1 だけ小さいので、数値をそのまま持ち込まないでください。
センサーが −100 と言っているのに Modbus レジスタが 65436 と読めるのはなぜ?
Modbus は型情報を持たない 16 ビットワードを運ぶため、符号なしと決めつけたクライアントは 65436 と表示しますが、機器の意図は 2 の補数の −100 です。65436 を 16 進の 0xFF9C としてビット幅 16 でここに貼り付ければ、2 の補数の行が意図された値を示します。
符号絶対値表現と1の補数は今も使われていますか?
整数ではほとんど使われません。現行の CPU はほぼすべて 2 の補数で、C23 でついに必須になりました。それでも重要なのは、IEEE 754 の浮動小数点数が符号絶対値表現のレイアウトを保っていることと、計算機アーキテクチャの試験問題に今も出てくるからです。
64ビットの値で誤った答えを返す計算機があるのはなぜ?
JavaScript のビット演算子はオペランドをまず 32 ビット整数に変換するため、~x + 1 で実装したページは 64 ビット値の上半分を黙って失い、もっともらしいけれど誤った結果を返します。このツールは全体を BigInt で処理するので、ここの 64 ビットの行はデバッガの表示と一致します。
負のゼロとは何で、なぜ問題になるのですか?
符号絶対値表現では 0000000010000000 の両方がゼロを意味し、1 の補数では 0000000011111111 です。したがって等しいはずの 2 つの値が、ビット単位の比較では等しくならないことがあります。2 の補数のゼロは 1 つだけで、これがハードウェアの特殊ケースをまとめて取り除きました。
入力した内容はサーバーに送られますか?
いいえ。ページは変換エンジンをブラウザへ配り、そこで実行します。レジスタダンプやファームウェアの値は外に出せないシステム由来であることが多いので、ここで信用してもらうものは何もありません。ネットワークタブを開けば、リクエストが 1 本も出ていないことを確認できます。

進数変換ツール — 2進数・16進数・10進数・8進数

単位変換

無料オンライン進数変換ツール。2進数、8進数、10進数、16進数および任意の基数(2-36)間で数値を瞬時に変換。BigInt対応で桁数制限なし。登録不要・サーバー送信なし、すべての処理がブラウザ内で完結。コピーボタンやコードリテラル出力で開発作業を効率化。

chmod 計算ツール — Linux ファイル権限

単位変換

Linux のファイル権限(パーミッション)を8進数(755・644)と rwx 記号で相互変換する無料計算ツール。chmod コマンドを自動生成し、chmod 755 の意味や 777 の危険な設定もひと目で確認。すべてブラウザ内で完結します。

カラーコンバーター — HEX, RGB, HSL & OKLCH

単位変換

HEX を RGB、HSL、OKLCH、OKLAB、CMYK にブラウザで変換できます。任意の形式をワンクリックでコピー。無料・登録不要・色データはページから一切送信されません。

HEX から CMYK へのコンバーター

単位変換

HEX カラーを CMYK にブラウザで変換できます。印刷プレビュー向けの sRGB ベースの単純な近似値です。無料・登録不要、色データはローカルから出ません。

HEX から HSL へのコンバーター

単位変換

任意の HEX カラーを HSL にブラウザで変換できます。3 桁・6 桁・アルファ付き 8 桁の HEX すべてに対応。無料・即時・登録不要、色データはページから一切送信されません。

HEX から OKLCH へのコンバーター

単位変換

HEX を OKLCH に変換し、Tailwind v4 デザイントークンに対応します。知覚的に均一なライブ出力に加え、Display P3 色域の警告も表示。無料・ブラウザ完結。