"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que fmt.Printf mostra uma representação binária diferente para números inteiros negativos do que o esperado em Go?

Por que fmt.Printf mostra uma representação binária diferente para números inteiros negativos do que o esperado em Go?

Publicado em 2024-11-08
Navegar:434

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

Complemento de Dois e fmt.Printf: Desvendando o Enigma da Representação Binária

Ao trabalhar com números inteiros assinados, os computadores empregam o complemento de Dois para representar valores negativos . Isto difere da representação binária típica, onde o sinal é indicado por um bit separado. Por exemplo, no complemento de Dois, o inteiro -5 é representado como 1111 1011.

No entanto, imprimir a representação binária usando fmt.Printf pode produzir resultados inesperados. Por exemplo, o seguinte trecho de código:

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

surpreendentemente gera -101 em vez de 1111 1011. Essa discrepância levou à questão de saber se o complemento de Dois está realmente sendo usado para representação interna ou se a formatação está obscurecendo a representação correta.

Para esclarecer esse assunto, precisamos nos aprofundar em como fmt.Printf formata números binários. O culpado reside na função fmt.integer, que converte automaticamente inteiros com sinal negativo em positivos. Esta conversão envolve negar o número inteiro e anexar um sinal - à string de saída. Assim, a saída -101 é uma representação de - anexada à representação binária de 5.

Para demonstrar isso ainda mais, converter o inteiro assinado em um inteiro não assinado e, em seguida, formatá-lo usando fmt.Printf produz os Dois corretos representação de complemento:

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

Isso gera 11111011, precisamente o complemento de Dois de -5.

Portanto, a representação interna de inteiros assinados em Go adere ao complemento de Dois convenção. A representação binária aparentemente incorreta ao formatar números inteiros assinados resulta da conversão automática e da adição de sinal realizada por fmt.integer. Compreender esse comportamento é essencial ao trabalhar com números inteiros assinados e representações binárias em Go.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3