8ビットの2の補数で −5 は?
11111011 11111011、16 進では 0xFB です。
符号付き10進数を入力すると、符号絶対値表現・1の補数・2の補数・ゲタばき表現を4〜64ビットで同時に算出します。ビット列や16進バイトを貼り付ければ、同じパターンの5通りの読み方を並べて確認できます。8ビットの−128に符号絶対値表現と1の補数が存在しないことも明示。すべてブラウザ内で処理、無料、登録不要。
符号付きの整数を入力してください。4 つの表現が同時に計算されるので、自分のシステムがどれを使っているかを前もって知っている必要はありません。
| エンコーディング | ビット列 | 16進数 |
|---|---|---|
| 符号絶対値表現 | 1000 0101 | 85 |
| 1の補数 | 1111 1010 | FA |
| 2の補数 | 1111 1011 | FB |
| ゲタばき表現 | 0111 1011 | 7B |
符号絶対値表現と 1 の補数はどちらも負のゼロにビットパターンを 1 つ使うため、2 の補数より表せる値が 1 つ少なく、最小値には届きません。
メモリダンプやレジスタで見つけた 1 バイトを、どう読むべきか分からない。貼り付ければ、各解釈でそれが何を意味するかが一度に並びます。どれが正しいかは作った側のシステム次第なので、すべて表示します。
| 読み方 | 値 |
|---|---|
| 符号なし | 251 |
| 符号絶対値表現 | -123 |
| 1の補数 | -4 |
| 2の補数 | -5 |
| ゲタばき表現 | 123 |
上のツールと同じエンジンで計算しているので、両者の値がずれることはありません。
| 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 |
Go Tools エンジニアリングチームが構築し、検証しています。
11111011 11111011、16 進では 0xFB です。
-128 … 127 2 の補数では −128 から 127、符号絶対値表現と 1 の補数では −127 から 127 です。
符号なし値 − 2^n 最上位ビットが 0 なら符号なしとして読み、1 なら符号なしの読みから 2^n を引きます。
−1 か 255 符号付きバイトなら −1、符号なしなら 255 です。ビットだけでは決まりません。
2 の補数が答えているのは数学の問題ではなく、ハードウェアの問題です。すでに作ってしまった加算器をそのまま使い続けられるように、負の数をどう格納するか。答えは −x を 2^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.
符号絶対値表現、1 の補数、2 の補数、ゲタばき表現をまとめて計算します。ゲタばき表現は多くの計算機が省くものですが、ADC のデータシートが今も使い続けているのはこれです。
手元にある実際のビット列や 16 進を貼り付ければ、符号なしを含む 5 通りの読み方が出ます。ダンプと機器の表示が食い違うときに必要なのは、この方向です。
すべての値を BigInt で扱うため、0xFFFFFFFFFFFFFF9C は 32 ビット切り捨ての産物ではなく −100 になります。
ビット幅 8 の −128 には、符号絶対値表現も 1 の補数の形もありません。表にはそう書きます。その数を意味しないパターンを印字したりはしません。
0 を入力すると、符号絶対値表現と 1 の補数におけるゼロの 2 つ目のビットパターンが表示されます。2 の補数が勝った理由を示す、いちばん分かりやすい一点です。
8 ビット対照表とビット幅ごとの範囲は、上の入力欄を動かすのと同じエンジンでビルド時に描画されます。だから両者がずれることはありません。
BigInt.asIntN、Python の int.from_bytes(..., signed=True)、C の固定幅型は、いま書いているコードにとって権威ある答えを返します。コードの中ではそれらを使い、値が目の前にあってインタプリタを開いていないときに、このページを使ってください。
プログラムが宣言した型で値を表示します。それはビットパターンに欠けている、まさにその情報です。ただし型の宣言なしに回線から届いたバイトには使えません。このページが引き受けるのは、その場合です。
基数どうしを変換しますが、扱えるのは非負の値だけです。負の数はあちらでは明示的に拒否されます。基数そのものは、符号をどう格納するかについて何も主張しないからです。符号付き表現はこのページの仕事で、絶対値の基数変換はあちらの仕事です。
浮動小数点側の対応ツールです。2 の補数ではなく符号絶対値表現のレイアウトを保ち、指数部には 2^(e−1)−1 のバイアスがかかります。つまり 2 つのページは、同じメモリ 1 ワードについて別々の問いに答えています。
-5、ビット幅 8
符号絶対値表現 1000 0101 1の補数 1111 1010 2の補数 1111 1011 (0xFB) ゲタばき表現 0111 1011
3 つのエンコーディングは符号ビットだけ一致し、それ以外はすべて食い違います。C の int8_t が実際に保持しているのは 2 の補数の行だけです。
0xFB、ビット幅 8
符号なし 251 符号絶対値表現 -123 1の補数 -4 2の補数 -5 ゲタばき表現 123
-128、ビット幅 8
符号絶対値表現 この幅では表現なし 1の補数 この幅では表現なし 2の補数 1000 0000 (0x80) ゲタばき表現 0000 0000
符号絶対値表現と 1 の補数はどちらも負のゼロにビットパターンを 1 つ使うため、範囲は −127 から 127 で −128 には届きません。ここでバイトを表示するツールは間違っています。
0xFFFFFFFFFFFFFF9C、ビット幅 64
2の補数 -100 符号なし 18446744073709551516
32 ビットを超えるものは BigInt で扱うほかありません。JavaScript の |、<<、>>> は黙って 32 ビットに切り詰めます。一部のオンライン計算機がここでエラーではなく誤った答えを返すのは、そのためです。
4、8、16、32、64 のいずれか。これは表示の好みではありません。同じビットでも幅が違えば別の数を意味するので、選び間違えると答えそのものが変わります。
マイナス符号も含めて整数を入力してください。4 つのエンコーディングが入力に合わせて更新され、それぞれの 16 進表記も同時に出ます。
2 進文字列か 0x 付きの値を逆引きフィールドに貼り付けると、そのパターンが各解釈でどんな数になるかが、符号なしの読み方も含めて分かります。
つまずきやすい 2 点をページが知らせます。最小値には符号絶対値表現と 1 の補数の形が存在しないこと、そしてその 2 つではゼロに 2 つ目のビットパターンがあることです。
ビットを反転しただけでは 1 の補数です。そこで止めると 2 の補数から 1 ずれますが、結果はもっともらしい負の数に見えるため気づきにくい間違いです。
5 = 00000101 ~5 = 11111010 <- ones' complement, not -5
5 = 00000101 ~5 = 11111010 ~5 + 1 = 11111011 <- -5 in two's complement
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 です。n−1 ビットが絶対値を普通の符号なし数として表します。範囲は −(2^(n−1)−1) から 2^(n−1)−1 で対称、ゼロは 2 つ。IEEE 754 の浮動小数点数が使っているのが、このレイアウトです。2^n − 1 − x です。範囲も 2 つのゼロも符号絶対値表現と同じ。加算にはエンドアラウンドキャリー(巡回桁上げ)が必要で、まさにそれが 2 の補数の取り除いた面倒です。英語表記でアポストロフィの位置が違うのは誤植ではありません。ones' complement は全ビット 1 のワードを基準にし、two's complement は 2 のべき乗 1 つを基準にします。−x は 2^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 小さい値です。&、|、~ とシフトのオペランドを 32 ビット整数に変換してから演算し、終わってから戻します。そのため 64 ビットの値は、何のエラーも出さずに上半分を失います。このページの変換はすべて任意精度整数の上で行うので、64 ビットの両端も正確に出ます。−(−128) はやはり −128 のままです。絶対値を計算するコードにはこの入力への方針が要りますし、テストにも必ず含めるべきです。0xFB を 16 ビットのフィールドに 0x00FB として写すと、−5 が 251 になります。符号付きの値を広げるとは符号ビットを複製することで、正しくは 0xFFFB です。BigInt.asIntN、Python の int.from_bytes(..., signed=True)、C の固定幅型は、意図を明示していて境界も処理してくれます。手書きの ~x + 1 こそが、ビット幅バグの発生源です。2^n − x のビットパターンで格納する取り決めのことです。これにより加算と減算が同じ回路で済み、数直線上のゼロがちょうど 1 つになります。 00000101 → 11111010 → 11111011。反転だけで止めたものが 1 の補数で、だから両者は常に 1 だけ離れています。 n ビットで −2^(n−1) から 2^(n−1)−1 までを覆います。符号絶対値表現や 1 の補数のように負のゼロへパターンを 1 つ浪費しないので、その余った 1 枠が負の側に落ちるからです。 int8_t か uint8_t に合う行を選んでください。 value + 2^(n−1) を格納します。最小値が全 0 になり、生のパターンを符号なし整数として並べた順序が、符号付きの値の順序と一致します。ADC や DAC の出力、音声のサンプル形式に現れます。なお IEEE 754 の指数部のバイアスは 2^(e−1)−1 で 1 だけ小さいので、数値をそのまま持ち込まないでください。 65436 と表示しますが、機器の意図は 2 の補数の −100 です。65436 を 16 進の 0xFF9C としてビット幅 16 でここに貼り付ければ、2 の補数の行が意図された値を示します。 ~x + 1 で実装したページは 64 ビット値の上半分を黙って失い、もっともらしいけれど誤った結果を返します。このツールは全体を BigInt で処理するので、ここの 64 ビットの行はデバッガの表示と一致します。 00000000 と 10000000 の両方がゼロを意味し、1 の補数では 00000000 と 11111111 です。したがって等しいはずの 2 つの値が、ビット単位の比較では等しくならないことがあります。2 の補数のゼロは 1 つだけで、これがハードウェアの特殊ケースをまとめて取り除きました。 単位変換
無料オンライン進数変換ツール。2進数、8進数、10進数、16進数および任意の基数(2-36)間で数値を瞬時に変換。BigInt対応で桁数制限なし。登録不要・サーバー送信なし、すべての処理がブラウザ内で完結。コピーボタンやコードリテラル出力で開発作業を効率化。
単位変換
Linux のファイル権限(パーミッション)を8進数(755・644)と rwx 記号で相互変換する無料計算ツール。chmod コマンドを自動生成し、chmod 755 の意味や 777 の危険な設定もひと目で確認。すべてブラウザ内で完結します。
単位変換
HEX を RGB、HSL、OKLCH、OKLAB、CMYK にブラウザで変換できます。任意の形式をワンクリックでコピー。無料・登録不要・色データはページから一切送信されません。
単位変換
HEX カラーを CMYK にブラウザで変換できます。印刷プレビュー向けの sRGB ベースの単純な近似値です。無料・登録不要、色データはローカルから出ません。
単位変換
任意の HEX カラーを HSL にブラウザで変換できます。3 桁・6 桁・アルファ付き 8 桁の HEX すべてに対応。無料・即時・登録不要、色データはページから一切送信されません。
単位変換
HEX を OKLCH に変換し、Tailwind v4 デザイントークンに対応します。知覚的に均一なライブ出力に加え、Display P3 色域の警告も表示。無料・ブラウザ完結。