"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 produz "-101" para um número inteiro assinado representado em complemento de dois?

Por que fmt.Printf produz "-101" para um número inteiro assinado representado em complemento de dois?

Publicado em 13/11/2024
Navegar:430

Why Does fmt.Printf Output \

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.

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