Home > Article > Backend Development > Why does fmt.Printf display a different binary representation for signed integers in Go?
How fmt.Printf Formats Binary Numbers for Signed Integers
In computer systems, signed integers are typically represented using two's complement notation. However, when using fmt.Printf to print the binary representation of a signed integer, one may encounter unexpected results.
For instance, consider the following code:
var i int8 = -5 fmt.Printf("%b", i)
This code produces an output of "-101", which is not the expected two's complement representation of "-5". This discrepancy stems from the internal handling of binary formatting by fmt.Printf.
The issue lies in the conversion of the negative signed integer to a positive one within fmt.Printf. The function reverses the sign of the input integer, making it effectively an unsigned integer. Consequentially, fmt.Printf appends a '-' sign before the converted unsigned binary representation.
To confirm this behavior, we can convert the signed integer to an unsigned integer and print it:
var u uint8 = uint(i) fmt.Printf("%b", u)
This results in an output of "11111011", which aligns with the two's complement representation of -5. Therefore, although the underlying value is indeed represented in two's complement internally, the fmt.Printf function alters the format during output.
The above is the detailed content of Why does fmt.Printf display a different binary representation for signed integers in Go?. For more information, please follow other related articles on the PHP Chinese website!