"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué fmt.Printf genera \"-101\" para un entero con signo representado en complemento a dos?

¿Por qué fmt.Printf genera \"-101\" para un entero con signo representado en complemento a dos?

Publicado el 2024-11-13
Navegar:947

Why Does fmt.Printf Output \

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 '-'.

Último tutorial Más>

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