2 の補数と fmt.Printf の不可解な出力
コンピューター サイエンスの領域では、2 の補数は表現に使用される一般的な方法です。内部的には符号付き整数。この表現では、ビットを反転して 1 を加算して負の数を表現します。たとえば、2 の補数では、-5 はバイナリ形式で "1111 1011" (^5 1 に相当) として表されます。
fmt.Printf を使用して符号付き整数のバイナリ表現を出力しようとすると、困惑が生じます。 。次のコード スニペットを考えてみましょう:
var i int8 = -5 fmt.Printf("%b", i)
このコードは、予想どおり、-5 の 2 の補数表現である「1111 1011」を出力するはずです。ただし、実際の出力は「-101」であり、この期待とは異なります。ここで疑問が生じます: 値は内部的に 2 の補数形式で格納されていますか? それとも別の表現が使用されていますか?
興味深いことに、値を印刷する前に値を符号なし整数に変換すると、望ましい結果が得られます。
var u uint8 = uint(i) fmt.Printf("%b", u)
これにより、出力は「11111011」になります。これは、次の 2 の補数表現です。 -5.
矛盾の核心は、fmt.Printf が 2 進数の書式設定をどのように処理するかにあります。 fmt.integer 関数を詳しく調べると、書式設定プロセス中に負の符号付き整数が正の整数に変換されることが明らかになります。
165 negative := signedness == signed && a < 0 166 if negative { 167 a = -a 168 }
この変換には、'-' プレフィックスを追加する必要があります。書式設定された文字列。前に確認した「-101」出力を説明します。
本質的に、値の内部表現は次のとおりです。 2 の補数規則では、fmt.integer の書式設定プロセスが負の符号付き整数を正の対応する整数に変換するため、予期しない出力が発生します。
以上がGo で符号付き整数のバイナリ表現を出力するときに fmt.Printf が「-101」を出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。