2 の補数と fmt.Printf: バイナリ表現の謎を解く
符号付き整数を扱う場合、コンピューターは負の値を表すために 2 の補数を使用します。 。これは、符号が別のビットで示される一般的なバイナリ表現とは異なります。たとえば、2 の補数では、整数 -5 は 1111 1011 として表されます。
ただし、fmt.Printf を使用してバイナリ表現を出力すると、予期しない結果が生じる可能性があります。たとえば、次のコード スニペット:
var i int8 = -5 fmt.Printf("%b", i)
は、驚くべきことに、1111 1011 ではなく -101 を出力します。この矛盾により、本当に 2 の補数が内部表現に使用されているのか、それとも書式設定がわかりにくくなっているのかという疑問が生じています。
この問題を明らかにするには、fmt.Printf が 2 進数をどのようにフォーマットするかを詳しく調べる必要があります。原因は、負の符号付き整数を正の整数に自動的に変換する fmt.integer 関数にあります。この変換には、整数を否定し、出力文字列の先頭に - 記号を追加することが含まれます。したがって、-101 出力は、5 のバイナリ表現に - が追加された表現です。
これをさらに実証するには、符号付き整数を符号なし整数に変換し、fmt.Printf を使用してフォーマットすると、正しい 2 が生成されます。補数表現:
var u uint8 = uint(i) fmt.Printf("%b", u)
これは、正確に -5 の 2 の補数である 11111011 を出力します。
したがって、Go の符号付き整数の内部表現は 2 の補数規則に従います。符号付き整数をフォーマットする際のバイナリ表現が正しくないように見えるのは、fmt.integer によって実行される自動変換と符号の付加が原因です。 Go で符号付き整数とバイナリ表現を扱う場合、この動作を理解することが不可欠です。
以上がfmt.Printf が負の整数に対して Go で予期されているものとは異なるバイナリ表現を表示するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。