O que você realmente quer dizer é:
$ echo "ibase=16; C0" | bc
192
para hexadecimal e:
$ echo "obase=16; 192" | bc
C0
para decimal para hexadecimal.
Você não precisa fornecer ibase
e obase
para qualquer conversão envolvendo números decimais, já que essas configurações são padronizadas para 10.
Você do precisa fornecer ambos para conversões como binário para hexadecimal. Nesse caso, acho mais fácil dar sentido às coisas se você der obase
primeiro:
$ echo "obase=16; ibase=2; 11000000" | bc
C0
Se você der ibase
primeiro, ele mudará a interpretação da seguinte configuração de obase
, de modo que o comando tenha que ser:
$ echo "ibase=2; obase=10000; 11000000" | bc
C0
Isso ocorre porque, nessa ordem, o valor obase
é interpretado como um número binário, portanto, é necessário fornecer 10000₂ = 16 para obter a saída em hexadecimal. Isso é desajeitado.
Agora, deixe-me explicar por que seus três exemplos se comportam como fazem.
-
echo "ibase=F;obase=A;C0" | bc
180
Isso define a base de entrada como 15 e a base de saída como 10, já que um valor de dígito único é interpretado em hexadecimal, de acordo com o POSIX . Isso pede a
bc
para lhe dizer o que C0₁₅ está na base A₁₅ = 10, e está respondendo corretamente 180₁₀, embora essa certamente não seja a pergunta que você queria fazer. -
echo "ibase=F;obase=10;C0" | bc
C0
Esta é uma conversão nula na base 15.
Por quê? Primeiro, porque o dígito
F
único é interpretado em hexadecimal, como apontei no exemplo anterior. Mas agora que você configurou para a base 15, a seguinte configuração da base de saída é interpretada dessa forma, e 10₁₅ = 15, então você tem uma conversão nula de C0₁₅ para C0₁₅.É isso mesmo, a saída não está em hexadecimal como você estava assumindo, está na base 15!
Você pode provar isso para si mesmo tentando converter
F0
em vez deC0
. Como não háF
dígito na base 15,bc
bloqueia aE0
e forneceE0
como saída. -
echo "ibase=16; obase=A; C0"
192
Este é o único dos seus três exemplos que provavelmente tem algum uso prático.
Ele está mudando a base de entrada para hexadecimal primeiro , para que você não precise mais cavar na especificação POSIX para entender porque
A
é interpretado como hex, 10 neste caso. O único problema é que é redundante definir a base de saída como A₁₆ = 10, já que é o valor padrão.