Restas manuales en "Binario"

Iniciado por AlbertoBSD, 1 Mayo 2016, 15:16 PM

0 Miembros y 1 Visitante están viendo este tema.

AlbertoBSD

Muy buen dia compañeros.

Ayer publique el tema Números de longitud variable en C (Numeros muy grandes)

Donde transformo strings de numeros a su representación en "binario"  en memoria. Ya hago sumas y multiplicaciones en forma de sumas multiples.
Necesito hacer ahora restas tengo mis dudas se que es una tonteria pero estoy hecho un lio.

Las sumas a nivel de "byte" las hago asi:

unsigned char resultado[3];
unsigned char acarreo;
unsigned char a;
unsigned char b;
unsigned short c;
a = 0xFF;
b = 0x01;
c = a + b;
//ahora c vale 0x0101
resultado[0] = c;
acarreo = c >> 8;
//el acarreo se le suma al siguiente ciclo de bytes


Asi puedo meter ese seudo codigo en un ciclo de N bytes y poder trabajar con numetro positivos de cualquier longitud

Ahora el detalle que necesito usar la operacion modulo y para ello necesito hacer diviciones y por lo tante necesito restas.

Mi duda es hacer las restas mas o menos igual

#include<stdio.h>

int main() {
unsigned char a;
unsigned char b;
unsigned short c;
a = 0xFF;
b = 0x01;
c = a - b;
}



Obvio tendré que tener forma de capturar los números negativos, y si es negativo ¿Que hay que hacer? ¿es como si fuera el acarreo en la suma?

intente hacer las restas en el cuaderno en binario y me dormi en el intento eso fue hace unas 5 horas.
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

HardForo

CitarYa hago sumas y multiplicaciones en forma de sumas multiples

Las potencias las puedes sacar exactamente igual :)
HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *

AlbertoBSD

Gracias boctulus y de hecho asi lo hice con las potencias:

Numero 65535

6 x10^4 : numeros[0]->valor: 0x451410 60ea
5 x10^3 : numeros[1]->valor: 0x451510 8813
5 x10^2 : numeros[2]->valor: 0x4514a0 f401
3 x10^1 : numeros[3]->valor: 0x451530 1e
5 x10^0 : numeros[4]->valor: 0x4513e0 05

Separe cada numero de la cadena y lo convertí a su numero en potencia de 10 y posteriormente sume los números individuales.

Mi problema ahora son las restas. como dice el titulo del post.

Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

MAFUS

#3
Ya lo tienes hecho. Las restas son sumas de complementos. Crea una función que haga el complemento a 2 de un número dado y éste será el sustraendo. La operación resultante seguirá siendo una suma.
Si el resultado de esta suma tiene acarreo, éste resultado es positivo. Si no tiene acarreo el resultado es negativo.

AlbertoBSD

#4
Gracias MAFUS por tu respuesta, leeré los temas que comentas para aplicar las restas.

Saludos!




Muy buen dia otra vez.

Tengo ahora una intriga sobre el compilador... pero veamos

La definición de complemento a 2 esta dada por 2^n - N donde n es el  numero de bits del numero dado N al que se le quiere sacar complemento, solución Método alterno sacar complemento 1 y sumarle 1 que es mas facil ~N +1

#include<stdio.h>

int main() {
unsigned char a,c;
unsigned short b;

a = 0xF0;
printf("Nunmero orignal 0x%.2x\n",a);
a = ~a;
printf("Complemento uno 0x%.2x\n",a);
b = a + 1;
c = b >> 8;
printf("Complemento dos 0x%.2x\n",b);
printf("? Acarreo : 0x%.2x\n",c);
a = 0xFF;
printf("Nunmero orignal 0x%.2x\n",a);
a = ~a;
printf("Complemento uno 0x%.2x\n",a);
b = a + 1;
c = b >> 8;
printf("Complemento dos 0x%.2x\n",b);
printf("? Acarreo : 0x%.2x\n",c);
a = 0x00;
printf("Nunmero orignal 0x%.2x\n",a);
a = ~a;
printf("Complemento uno 0x%.2x\n",a);
b = a + 1;
c = b >> 8;
printf("Complemento dos 0x%.2x\n",b);
printf("? Acarreo : 0x%.2x\n",c);
}


El codigo anterior me da la salida:


Nunmero orignal 0xf0
Complemento uno 0x0f
Complemento dos 0x10
? Acarreo : 0x00
Nunmero orignal 0xff
Complemento uno 0x00
Complemento dos 0x01
? Acarreo : 0x00
Nunmero orignal 0x00
Complemento uno 0xff
Complemento dos 0x100
? Acarreo : 0x01


Lo que me intriga es:

Complemento dos 0x100

Que viene de la linea :

printf("Complemento dos 0x%.2x\n",b);

b es un short pero el formato de cadena es %.2x por lo cual solo me debería de mostrar los primeros 2 hexadecimales correspondientes al primer byte del numero short, en fin... no es problema realmente puedo usar posiciones de memoria para extraer solo el numero que me interesa, solo que me intrigo que no respeto el formato de la cadena...

ahora solo me queda hacer la... resta que quiero usando sumas xD jajajajaja con complemento a 2 en el sustraendo, todavía no la hago pero tengo que ver bien como es el proceso a nivel de bit, lo voy a hacer ahora si en el cuaderno para darme una idea real de que pasa....

Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW