Complemento de dois e saída binária fmt.Printf
Quando os computadores usam o complemento de dois para representar inteiros assinados, um valor como -5 é armazenado como o padrão de bits "1111 1011." No entanto, ao tentar imprimir esta representação binária usando fmt.Printf assim:
var i int8 = -5
fmt.Printf("%b", i)
A saída mostra inesperadamente "-101." Por que isso está acontecendo e o complemento de Dois está sendo usado internamente?
O problema com a formatação binária
A discrepância está na maneira como fmt.Printf lida com a formatação binária. Ao formatar um número inteiro com sinal negativo, ele o converte em um valor positivo e, em seguida, anexa um sinal '-' antes da string formatada.
Olhando para o código-fonte de fmt.Printf, descobrimos que fmt.integer converte um número inteiro assinado para um valor positivo antes de formatá-lo:
negative := signedness == signed && a Saída não assinada vs. assinada
Para demonstrar isso, considere este código:
var u uint8 = uint(i)
fmt.Printf("%b", u)
Aqui, convertemos i em um número inteiro sem sinal antes de imprimi-lo. Desta vez, a saída mostra corretamente "11111011", que é o complemento de dois de -5.
Conclusão
Para imprimir corretamente a representação binária de um número inteiro assinado usando fmt.Printf, devemos primeiro convertê-lo em um número inteiro positivo usando um tipo não assinado. Isso garante que fmt.Printf não converta automaticamente o valor em um valor negativo e acrescente um sinal '-' antes.
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