Complemento a dos y salida binaria fmt.Printf
Cuando las computadoras usan el complemento a dos para representar enteros con signo, un valor como -5 se almacena como el patrón de bits "1111 1011". Sin embargo, al intentar imprimir esta representación binaria usando fmt.Printf de esta manera:
var i int8 = -5
fmt.Printf("%b", i)
El resultado muestra inesperadamente "-101". ¿Por qué sucede esto? ¿Se utiliza internamente el complemento a dos?
El problema con el formato binario
La discrepancia radica en la forma en que fmt.Printf maneja el formato binario. Al formatear un entero con signo negativo, lo convierte en un valor positivo y luego agrega un signo '-' antes de la cadena formateada.
Al examinar el código fuente de fmt.Printf, encontramos que fmt.integer convierte un entero con signo a un valor positivo antes de formatearlo:
negative := signedness == signed && a Salida sin firmar versus salida firmada
Para demostrar esto, considere este código:
var u uint8 = uint(i)
fmt.Printf("%b", u)
Aquí, convertimos i en un entero sin signo antes de imprimirlo. Esta vez, el resultado muestra correctamente "11111011", que es el complemento a dos de -5.
Conclusión
Para imprimir correctamente la representación binaria de un entero con signo usando fmt.Printf, primero debemos convertirlo a un entero positivo usando un tipo sin signo. Esto garantiza que fmt.Printf no convierta automáticamente el valor a un valor negativo y anteponga un signo '-'.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3