2016-06-02 35 views
7

コンピュータでは、符号付き整数を内部的に表現するために2の補数を使用しています。すなわち、-5は、^ 5 + 1 = "1111 1011"と表される。しかし、バイナリ表現を印刷しようとする。次のコード:Golang:2の補数とfmt.Printf

var i int8 = -5 
fmt.Printf("%b", i) 

出力-101。私が期待しているものではありません。結局のところフォーマットが違うのか、結局2の補数を使用していないのでしょうか?

興味深いことに、 "正しい" のビットパターンにunsigned int型の結果への変換:

var u uint8 = uint(i) 
fmt.Printf("%b", u) 

出力する11111011ある - -5の正確に2の補数。

値は内部的には2の補数を使用していますが、書式設定では符号なし5と、プレフィックスは-です。

誰かがこれを明確にすることはできますか?

+2

誰もがなぜこの「奇妙な」と考えるのか分かりません。どんな数の基数を使用しても、負の数は依然として負の値です。あなたがベース8、12または16でそれを求めたら、私は同じことを期待しています。 –

+0

さて、私は変だとは言わなかった。私は2の補数を理解しようとしていただけで、結果は私が期待していたものではありませんでした。 – joerx

+0

高水準言語で書かれた数値書式化関数を使って2の補数を理解することは本当に望めないと思います。 –

答えて

5

回答は、fmtモジュールが内部形式ではなくバイナリ形式をどのようにフォーマットするかにあると考えています。

あなたはfmt.integerで見てみる場合は、機能がないことを非常に最初のアクションのいずれかが正の1に負の符号付き整数に変換することです:

165  negative := signedness == signed && a < 0 
    166  if negative { 
    167   a = -a 
    168  } 

の前で-を追加するロジックは、次にあります出力される文字列はhereです。

IOW -101は、実際には-の2進数で5です。

注:pp.fmtInt64からprint.goに呼び出され、それ自体が同じ機能のpp.printArgから呼び出されます。