Two's Complement and fmt.Printf Binary Output
When computers use Two's complement to represent signed integers, a value like -5 is stored as the bit pattern "1111 1011." However, when trying to print this binary representation using fmt.Printf like this:
<code class="go">var i int8 = -5 fmt.Printf("%b", i)</code>
The output unexpectedly shows "-101." Why is this happening, and is Two's complement being used internally?
The Issue with Binary Formatting
The discrepancy lies in the way fmt.Printf handles binary formatting. When formatting a negative signed integer, it converts it to a positive value and then appends a '-' sign before the formatted string.
Looking into the source code of fmt.Printf, we find that fmt.integer converts a signed integer to a positive value before formatting it:
<code class="go"> negative := signedness == signed && a < 0 if negative { a = -a }</code>
Unsigned vs. Signed Output
To demonstrate this, consider this code:
<code class="go">var u uint8 = uint(i) fmt.Printf("%b", u)</code>
Here, we convert i to an unsigned integer before printing it. This time, the output correctly shows "11111011," which is the Two's complement of -5.
Conclusion
To correctly print the binary representation of a signed integer using fmt.Printf, we should first convert it to a positive integer using an unsigned type. This ensures that fmt.Printf does not automatically convert the value to a negative value and prepend a '-' sign.
The above is the detailed content of Why Does fmt.Printf Output \'-101\' for a Signed Integer Represented in Two\'s Complement?. For more information, please follow other related articles on the PHP Chinese website!