🧪 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