Go と C で -1 を 16 進数として出力すると異なる結果が生じるのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-16 00:58:03
オリジナル
162 人が閲覧しました

Why does printing -1 as hexadecimal in Go and C produce different results?

Go と C の 16 進数出力の違いを理解する: -1 の場合

Go では、整数を出力するための %x 形式は、 16 進表記の値。これは、符号付き整数のメモリ表現を出力する C の %x とは異なります。この違いにより、負の整数 -1 を出力するときに予期しない結果が発生します。

Go:

var x uint64 = 1 << 64 - 1
fmt.Printf("%x\n", x)
ログイン後にコピー

出力:

ffffffffffffffffffff
ログイン後にコピー

ここで、%x は正しく出力します。符号なし値の 16 進表現 1<<64 - 1.

C:

#include <stdio.h>
int main() {
  uint64_t x = 1LL << 64 - 1;
  printf("%x\n", (long long)x);
}
ログイン後にコピー

出力:

-1
ログイン後にコピー

C では、%x は符号付き整数値 -1 を出力し、負の 16 進数になるように見えます。先頭に「-」を付けた番号。しかし、そうではありません。 「-」記号は整数が負であることを示し、16 進値 ffff...ff は -1 の 2 の補数表現です。

Go は厳密な型指定を強制し、符号付き整数を次のように扱うために明示的な型変換を必要とします。無署名。 Go で -1 を符号なしの値として出力するには:

i := -1 // type int
fmt.Printf("%x", uint(i))
ログイン後にコピー

出力:

ffffffff
ログイン後にコピー

このアプローチでは、符号付き整数 -1 が対応する符号なしの整数に変換され、正しい 16 進表現が得られます。 .

Go のデフォルトの動作では、負の整数を符号付き値として出力するため、簡潔な表現が可能ですが、 16 進数のコンテキストでは予期しない結果が生じる可能性があります。これらの違いを理解することは、Go で効果的なコードを書くために非常に重要です。

以上がGo と C で -1 を 16 進数として出力すると異なる結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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