Go で fmt.Printf が符号付き整数の間違ったバイナリ表現を表示するのはなぜですか?

Susan Sarandon
リリース: 2024-11-03 11:29:29
オリジナル
210 人が閲覧しました

Why Does fmt.Printf Display Incorrect Binary Representations for Signed Integers in Go?

2 の補数と fmt.Printf の不一致

元の質問:

のバイナリ表現を出力しようとしたとき符号付き整数の場合、fmt.Printf は、予期された 2 の補数の値とは異なる出力を生成します。

分析:

2 の補数は、符号付きを内部的に表現するためにコンピュータで使用される手法です。整数。たとえば、-5 は 1111 1011 と表されます。ただし、fmt.Printf を符号付き整数とともに使用すると、予期しない結果が生成されます。ただし、符号なし整数に変換すると、正しいバイナリ表現になります。

説明:

観察された動作は、整数の内部表現によるものではありません。これは、fmt.Printf による 2 進数のフォーマット方法の結果です。

fmt.Printf で使用される fmt.integer 関数は、フォーマットする前に負の符号付き整数を正の値に変換します。これにより、絶対値のバイナリ値の前に - 記号が追加されます。

例:

<code class="go">var i int8 = -5
fmt.Printf("%b", i) // Outputs: -101 (Incorrect)</code>
ログイン後にコピー

この例では、-5 は 5 に変換されます。バイナリで、先頭に . が追加され、結果は -101 になります。

解決策:

符号付き整数の正しいバイナリ表現を取得するには、次のように変換できます。それを符号なし整数に変換し、fmt.Printf を使用してバイナリ表現を出力します。

<code class="go">var i int8 = -5
var u uint8 = uint8(i)
fmt.Printf("%b", u) // Outputs: 1111 1011 (Correct)</code>
ログイン後にコピー

以上がGo で fmt.Printf が符号付き整数の間違ったバイナリ表現を表示するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート