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