talvez a pergunta esteja apenas no forum errado... em sua implementacao original, C foi feita para processadores que lidavam com inteiros de 8 bits (char), 16 bits (short) e 32 bits (long). dependendo da maquina, int era de 16 ou 32 bits, indicando o tamanho mais natural da ALU do processador. e nestas maquinas vc tinha tambem suporte a ponto flutuante de precisao simples (float de 32 bits) ou dupla (double de 64 bits), bem como suporte a manipulacao de bits e ponteiros (incremento, decremento, indexacao, etc). a linguagem em si eh estruturada em torno de uma stack e usa os registros como uma "cache" para a stack.
em um PDP11, uma das maquinas onde C se popularizou inicialmente na decada de 70, cada linha de codigo C quase corresponde a uma linha de codigo asm, ou seja, a linguagem eh um asm de alto nivel.
no caso do PIC, tem que considerar que nem eh um procesador de verdade, mas sim um subproduto (um coprocessador de IO de uma era distante, programado diretamente em microcodigo) que foi reempacotado como sendo um processador. diferentemente da maioria dos processadores modernos que eh projetada focando linguagens estruturadas, o PIC nunca focou isso, entao adaptar uma coisa a outra dah um trampo gigantesco. dah para fazer, mas ateh em um Z80 vc faria de forma mais simples! e talvez uma boa escola para isso ainda seja dar uma olhada em como faziam essas operacoes multiprecisao em um Z80... eh uma boa escola!
mas assim, soh para adiantar o negocio... normalmente vc faz bibliotecas e vai construindo as coisas, do basico para o mais avancado. no caso, comeca com operacoes basicas multiprecisao: and, or, xor, not... sem muito segredo, por exemplo, um xor de 32 bits consiste simplesmente em fazer 4 xor sucessivamente. uma soma e subtracao multiprecisao jah eh um pouco mais complexa. se vc tem os bytes ABCD e vai somar com EFGH, vc vai fazer a soma de D+H primeiro, daih se der um overflow vai ter um carry, entao vc soma C+G+carry, se der overflow vai ter um carry e faz assim sucessivamente: B+F+carry e A+E+carry. para subtracao, vc pode usar a propria soma e apenas negar o segundo operando, assim ABCD-EFGH = ABCD + not(EFGH) + 1. e a soma multiprecisao vc jah conhece. para multiplicar, depende. vc vai precisar, certamente implementar o shift para a esquerda, o que nao eh complexo: ABCD << 1 vai ser feito primeiro D<<1, daih C<<1 com carry, B<<1 com carry, A<<1 com carry.
se o processador tem multiplicacao, vc pode fazer um truque AB*CD vai ser B*D + (A*D +C*B)<<8 + A*C<<16... os operandos de entrada de 16 bits vao gerar um resultado de 32 bits. outra forma eh fazer bit a bit, ou seja AB*CD vc pega sucessivamente M=AB<<1 e entao avalia bit a bit CD da direita para esquerda: se o bit for 1, entao T=T+M, senao nao faz nada. o resultado eh que vc tem 16 somas do operando M, que eh AB shiftado de 1 em 1. em termos praticos:
AB = 1110011100001111
CD = 0000000000000010
para simplificar.
vc tem entao:
AB<<0 = 1110011100001111 -> bit(0) de CD = 0
AB<<1 = 11100111000011110 -> bit(1) de CD = 1
AB<<2 = 111001110000111100 -> bit(2) de CD = 0
...
o resultado eh que na soma vc tem apenas AB<<1, pq eh o unico bit 1. isso para simplificar, pq senao ia complicar, mas enfim, note que o resultado eh precisamente o que esperavamos.
na divisao, imagine que vc tem AB*CD = EFGH. entao pense o contrario, EFGH/AB seria quantas vezes cabem AB em EFGH. uma solucao trivial seria subtrair EFGH-AB ateh EFGH for menor que AB. outra solucao seria uma subtracao binaria, ou seja, vc faz EFGH - AB<<31, se o resultado for positivo, vc soma CD = CD+1<<31, senao vc nao faz nada. e faz isso para AB<<31 ateh AB<<0. o resultado somado em CD eh a divisao.
tendo as operacoes logicas multiprecisao (and, or, xor, not), shifts (esquerda e direita) e aritmetica basica (add, neg, mul, div), vc pode implementar operacoes de ponto fixo ou ponto flutuante. no caso de ponto fixo, recomendaria vc ler isso aqui:
http://en.wikipedia.org/wiki/Q_%28number_format%29no caso de ponto flutuante:
http://en.wikipedia.org/wiki/IEEE_floating_pointmas em essencia, com ponto flutuante as operacoes vai usar as operacos da sua biblioteca basica. por exemplo, ponto fixo de precisao simples consiste em 24 bits de mantissa e 8 bits de expoente. nao eh dificil imaginar que (A^m)*(B^n) em ponto flutuante seria algo como A*B^(m+n), onde A*B eh uma operacao de 24 bits e m+n uma operacao de 8 bits, justamente as operacoes que vc jah teria na sua biblioteca multiprecisao.
Sent from my iPhone using Tapatalk