go - Golang: Two's complement and fmt.Printf -
so computers use two's complement internally represent signed integers. i.e., -5 represented ^5 + 1 = "1111 1011".
however, trying print binary representation, e.g. following code:
var int8 = -5 fmt.printf("%b", i)
outputs -101
. not quite i'd expect. formatting different or not using two's complement after all?
interestingly, converting unsigned int results in "correct" bit pattern:
var u uint8 = uint(i) fmt.printf("%b", u)
output 11111011
- 2s complement of -5
.
so seems me value internally using two's complement, formatting printing unsigned 5
, prepending -
.
can clarify this?
i believe answer lies in how fmt
module formats binary numbers, rather internal format.
if take @ fmt.integer
, 1 of first actions function convert negative signed integer positive one:
165 negative := signedness == signed && < 0 166 if negative { 167 = -a 168 }
there's logic append -
in front of string that's output here.
iow -101
-
appended 5
in binary.
note: fmt.integer
called pp.fmtint64
in print.go, called pp.printarg
in same function.