Estou usando a abordagem de divisão para converter um número inteiro unsigned int para binário. Tenho o seguinte código. No entanto, não obtenho nenhuma saída do programa após compilar e executar (só obtenho escape de nova linha).
#include <stdio.h>
/*
unsigned int is 0 or greater than 0
convert unsigned int into binary.
*/
const int ARRAY_SIZE = 100;
void reverseCharArray(char *x, int len) {
for (int end = len - 1, beg = 0; beg < end; end--, beg++) {
char temp = x[beg];
x[beg] = x[end];
x[end] = temp;
}
}
void convertWholeNumberToBinary(unsigned int x, char *result) {
int i = 0;
while (x != 0) {
result[i] = x % 2;
x = x / 2;
i++;
}
reverseCharArray(result, ARRAY_SIZE);
}
int main() {
char result[ARRAY_SIZE];
convertWholeNumberToBinary(294, result);
// 100100110
printf("%s\n", result);
return 0;
}
A saída desejada é "100100110" quando a entrada é 294. Eu esperava que o stdout mostrasse "100100110". Sei que estou esquecendo de algo, mas não consigo entender no momento.
Com a versão atual do C (C23), use
"%b"
Você está cometendo alguns erros, mas o maior é quando você inverte seu array char. Você está passando,
ARRAY_SIZE
mas o array não foi totalmente preenchido porque não podemos inserir um inteiro de 99 bits, então ainda há valores indeterminados no final do array que são trocados para a frente dele. Se o último caractere no final do array for apenas um,'\0'
você agora tem uma string vazia terminada em nulo para imprimir.Em vez disso, você deseja passar
i
, que indica o comprimento real da string no final do loop.Você também está adicionando
1
ou0
à string, em vez do equivalente char.Terceiro, você não está inicializando seu array char em
main
então seu conteúdo é indeterminado. Agora, já que suas outras funções não terminam explicitamente a string com null, você entra em território de comportamento indefinido ao imprimi-la como uma string. Solução simples: inicialize esse array char com""
, o que pode não funcionar se isso for compilado com um compilador C (vs. C++).Alternativamente, basta inserir o terminador nulo em
convertWholeNumberToBinary
.A solução será mais simples (e rápida) se o resultado for escrito diretamente no buffer na ordem correta para evitar a necessidade de inverter a string.
Certamente, não sabemos o tamanho do resultado antecipadamente, mas podemos escrever o buffer do final para baixo e então exibir apenas a parte que foi escrita.
Ao escrever cada dígito, ele precisa ser convertido de seu valor numérico (0 ou 1) para o caractere ASCII ('0' ou '1') para exibição. Isso pode ser feito adicionando '0' (o caractere ASCII '0' tem o valor numérico 48).
Como esse método funciona enquanto o dígito estiver no intervalo de 0 a 9, é bastante simples generalizar a função para converter números para qualquer base no intervalo de 2 a 10.
Em suma, isso pode ser implementado da seguinte forma:
Além do que já foi dito, talvez como iniciante não pense muito nisso, mas comece com algo mais fácil, como uma rotina traduzindo um inteiro de largura fixa para a string binária correspondente. Então você sabe o tamanho exato. Não há necessidade de divisão ou reversão do array também. Apenas mascare um dígito binário por vez, então insira os caracteres no array do fim de volta para o começo. Exemplo:
Saída:
Este é o exemplo mais fundamental: se você entender esse código, entenderá a maior parte do que é valioso tirar do exercício.
Mas é claro que a partir daqui você pode tornar esse código mais avançado, como mascarar zeros à esquerda, oferecer suporte a diferentes tamanhos binários, imprimir dígitos com espaços entre cada nibble/byte, etc.