O objetivo deste trabalho é construir uma biblioteca para manipulação de inteiros grandes de 128 bits. A biblioteca deverá prover as operações aritméticas básicas (somar, subtrair, multiplicar), comparação e operações de deslocamento de bits.
A biblioteca deve ser implementada em C, usando a seguinte definição
para o tipo do inteiro grande:
#define NUM_BYTES 16 typedef unsigned char BigInt[NUM_BYTES];
Ou seja, uma variável do tipo BigInt é representada por este array, que deve ser interpretado como um único inteiro de 128 bits, seguindo a ordem little-endian. Dependendo do tipo de operação, o valor armazenado deve ser interpretado como um valor sem sinal (unsigned) ou como um valor com sinal, representado em complemento a dois.
Por exemplo, o array
{0xFE, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF}
,
se interpretado como um valor inteiro com sinal,
representa o inteiro
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
(-2).
Este mesmo array, se interpretado como um valor inteiro sem sinal,
representa o inteiro 2128-2.
/* Atribuição */Sua biblioteca deve ser implementada como um arquivo C com nome "bigint.c". Este arquivo deve conter apenas a implementação das funções acima (e, eventualmente, funções auxiliares). Ele deve incluir a linha
/* res = val (extensão com sinal) */ void big_val (BigInt res, int val);
/* res = uval (extensão sem sinal) */ void big_uval (BigInt res, unsigned int uval);
/* Operacoes aritméticas */
/* res = a + b */ void big_sum (BigInt res, BigInt a, BigInt b);
/* res = a - b */ void big_sub (BigInt res, BigInt a, BigInt b);
/* res = a * b (com sinal) */ void big_mul (BigInt res, BigInt a, BigInt b);
/* res = a * b (sem sinal) */ void big_umul (BigInt res, BigInt a, BigInt b);
/* Operacoes de deslocamento */
/* res = a << n */ void big_shl (BigInt res, BigInt a, int n);
/* res = a >> n (lógico) */ void big_shr (BigInt res, BigInt a, int n);
/* Comparação: retorna -1 (a < b), 0 (a == b), 1 (a > b) */
/* comparação com sinal */ int big_cmp(BigInt a, BigInt b);
/* comparação sem sinal */ int big_ucmp(BigInt a, BigInt b);
#include "bigint.h"(arquivo de cabeçalho com os protótipos das funções da biblioteca, que pode ser obtido aqui)
teste.c
,
contendo uma função main
. Este arquivo também deverá
conter a linha
#include "bigint.h"
Crie seu programa executável teste
com a linha:
gcc -Wall -o teste bigint.c teste.c
Recomendações:
main
!
/* Nome_do_Aluno1 Matricula */ /* Nome_do_Aluno2 Matricula */