ホームページ バックエンド開発 Golang fmt.Printf が負の整数に対して Go で予期されているものとは異なるバイナリ表現を表示するのはなぜですか?

fmt.Printf が負の整数に対して Go で予期されているものとは異なるバイナリ表現を表示するのはなぜですか?

Nov 02, 2024 pm 04:11 PM

Why does fmt.Printf show a different binary representation for negative integers than expected in Go?

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Mar 03, 2025 pm 05:17 PM

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか?

Beegoフレームワークのページ間で短期情報転送を実装する方法は? Beegoフレームワークのページ間で短期情報転送を実装する方法は? Mar 03, 2025 pm 05:22 PM

Beegoフレームワークのページ間で短期情報転送を実装する方法は?

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? Mar 03, 2025 pm 05:18 PM

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は?

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? Mar 10, 2025 pm 03:20 PM

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか?

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? Mar 10, 2025 pm 05:38 PM

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか?

Go言語でファイルを便利に書く方法は? Go言語でファイルを便利に書く方法は? Mar 03, 2025 pm 05:15 PM

Go言語でファイルを便利に書く方法は?

Goでユニットテストをどのように書きますか? Goでユニットテストをどのように書きますか? Mar 21, 2025 pm 06:34 PM

Goでユニットテストをどのように書きますか?

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? Mar 10, 2025 pm 05:36 PM

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか?

See all articles