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