"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 muestra una representación binaria para números enteros negativos diferente a la esperada en Go?

¿Por qué fmt.Printf muestra una representación binaria para números enteros negativos diferente a la esperada en Go?

Publicado el 2024-11-08
Navegar:625

Why does fmt.Printf show a different binary representation for negative integers than expected in Go?

Complemento a dos y fmt.Printf: desentrañando el enigma de la representación binaria

Cuando se trabaja con números enteros con signo, las computadoras emplean el complemento a dos para representar valores negativos . Esto difiere de la típica representación binaria, donde el signo se indica mediante un bit separado. Por ejemplo, en complemento a dos, el número entero -5 se representa como 1111 1011.

Sin embargo, imprimir la representación binaria usando fmt.Printf puede producir resultados inesperados. Por ejemplo, el siguiente fragmento de código:

var i int8 = -5
fmt.Printf("%b", i)

sorprendentemente genera -101 en lugar de 1111 1011. Esta discrepancia ha llevado a la pregunta de si el complemento a dos realmente se está utilizando para la representación interna o si el formato oscurece la representación correcta.

Para arrojar luz sobre este asunto, necesitamos profundizar en cómo fmt.Printf formatea archivos binarios. números. El culpable reside en la función fmt.integer, que convierte automáticamente enteros con signo negativo en positivos. Esta conversión implica negar el número entero y anteponer un signo - a la cadena de salida. Por lo tanto, la salida -101 es una representación de - adjunta a la representación binaria de 5.

Para demostrar esto aún más, convertir el entero con signo en un entero sin signo y luego formatearlo usando fmt.Printf produce los Dos correctos. representación del complemento:

var u uint8 = uint(i)
fmt.Printf("%b", u)

Esto genera 11111011, precisamente el complemento a dos de -5.

Por lo tanto, la representación interna de los enteros con signo en Go se adhiere al complemento a dos convención. La representación binaria aparentemente incorrecta al formatear números enteros con signo resulta de la conversión automática y el antepuesto de signo realizado por fmt.integer. Comprender este comportamiento es esencial cuando se trabaja con números enteros con signo y representaciones binarias en Go.

Ú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