Skip to content

🧪 Laboratório 3 - Conversão de Bases


📝 Descrição - Peso 1

Escreva um programa C que leia uma string da entrada do usuário e a converta em binário, decimal, octal e hexadecimal. O programa deve lidar com números positivos e negativos.

Seu programa deve ler uma série de caracteres 0 e 1 da entrada padrão (STDIN). Esses caracteres representarão um binário qualquer de 32bits, por exemplo: 00000000010101000101011001001000. Abaixo, você encontrará as funções necessárias para ler/escrever informações de/para a entrada/saída padrão, juntamente com uma ilustração concisa de como elas podem ser utilizadas:

int read(int __fd, const void *__buf, int __n){
    int ret_val;
  __asm__ __volatile__(
    "mv a0, %1           # file descriptor\n"
    "mv a1, %2           # buffer \n"
    "mv a2, %3           # size \n"
    "li a7, 63           # syscall write code (63) \n"
    "ecall               # invoke syscall \n"
    "mv %0, a0           # move return value to ret_val\n"
    : "=r"(ret_val)  // Output list
    : "r"(__fd), "r"(__buf), "r"(__n)    // Input list
    : "a0", "a1", "a2", "a7"
  );
  return ret_val;
}

void write(int __fd, const void *__buf, int __n)
{
  __asm__ __volatile__(
    "mv a0, %0           # file descriptor\n"
    "mv a1, %1           # buffer \n"
    "mv a2, %2           # size \n"
    "li a7, 64           # syscall write (64) \n"
    "ecall"
    :   // Output list
    :"r"(__fd), "r"(__buf), "r"(__n)    // Input list
    : "a0", "a1", "a2", "a7"
  );
}

void exit(int code)
{
  __asm__ __volatile__(
    "mv a0, %0           # return code\n"
    "li a7, 93           # syscall exit (64) \n"
    "ecall"
    :   // Output list
    :"r"(code)    // Input list
    : "a0", "a7"
  );
}

void _start()
{
  int ret_code = main();
  exit(ret_code);
}

#define STDIN_FD  0
#define STDOUT_FD 1

int main()
{
  char str[33];
  /* Read up to 8 bytes from the standard input into the str buffer */
  int n = read(STDIN_FD, str, 33);
  /* Write n bytes from the str buffer to the standard output */
  write(STDOUT_FD, str, n);
  return 0;
}

Descrição da Entrada do Programa

Uma string de até 4 bytes (i.e., 32 caractéres), seguida por um caractere de nova linha ("\n").

Descrição da Saída do Programa

Depois de ler a string, você deve imprimir as seguintes informações seguidas de caracteres de nova linha:

  • O valor em base decimal assumindo que o número de 32 bits está codificado em representação em complemento de dois (neste caso, se o bit mais significativo for 1, o número é negativo);
  • O valor em base decimal, assumindo que o número de 32 bits está codificado em representação não assinada e seu endianness foi trocado;
  • O valor em base hexadecimal precedido de “0x”. Se o número for negativo, você deverá mostrar o valor na representação em complemento de dois (conforme ilustrado no quarto exemplo abaixo);
  • O valor em base octal precedido de “0o”. Se o número for negativo, você deverá mostrar o valor na representação em complemento de dois (conforme ilustrado no quarto exemplo abaixo);
  • O valor em base binária precedido por “0b”. Se o número for negativo, você deverá exibir o valor na representação em complemento de dois (conforme ilustrado no quarto exemplo abaixo) com endiness trocado;
  • O valor em base decimal assumindo que o número de 32 bits está codificado em representação em complemento de dois (neste caso, se o bit mais significativo for 1, o número é negativo) com endinness trocado;
  • O valor em base hexadecimal precedido de “0x”. Se o número for negativo, você deverá mostrar o valor na representação em complemento de dois (conforme ilustrado no quarto exemplo abaixo) com endinness trocado;
  • O valor em base octal precedido de “0o”. Se o número for negativo, você deverá mostrar o valor na representação em complemento de dois (conforme ilustrado no quarto exemplo abaixo) com endinness trocado;

📥 Exemplos

Entrada | 01100001011000010110000101100001
--------|---------------|
Saída   | 1633771873
        | 1633771873
        | 0x61616161
        | 0o14130260541
        | 0b1100001011000010110000101100001
        | 1633771873
        | 0x61616161
        | 0o14130260541


Entrada | 00000000010101000101011001001000
--------|---------------|
Saída   | 5527112
        | 1213617152
        | 0x545648
        | 0o25053110
        | 0b1001000010101100101010000000000
        | 1213617152
        | 0x48565400
        | 0o11025452000

Entrada | 00000000111000011000111010010010
--------|---------------|
Saída   | 14782098
        | 2458837248
        | 0xe18e92
        | 0o70307222
        | 0b10010010100011101110000100000000
        | -1836130048
        | 0x928ee100
        | 0o22243560400

Entrada | 11000011101001111100001110100111
--------|---------------|
Saída   | -1012415577
        | 2814617539
        | 0xc3a7c3a7
        | 0o30351741647
        | 0b10100111110000111010011111000011
        | -1480349757
        | 0xa7c3a7c3
        | 0o24760723703

Entrega

Utilize o assistente disponível neste link para avaliar seu código e gerar o relatório de execução.

  • Renomeie o arquivo de relatório para lab3_ra.report antes de submeter no Classroom

Warning

  • Qualquer alteração no arquivo de report será considerado fraude
  • Está é uma atividade individual, o qual deve ser desenvolvido individualmente, qualquer forma de cópia ou plágio será penalizada. Portanto, atividades que apresentarem semelhanças injustificadas serão atribuídas nota zero para todos os envolvidos