Ciertamente es posible trabajar con números muy grandes, incluso en computadoras de 8 o 4 bits. No es muy eficiente, pero es posible. La forma en que se hace esto es operando en los números en partes, con el apoyo de instrucciones específicas del procesador.
Un microcontrolador de 8 bits común es la serie AVR de Atmel. Para agregar números de 8 bits, usa una instrucción llamada AGREGAR. Esta instrucción se utiliza para sumar dos valores de registro juntos. Por ejemplo, puedes hacer
LDI R16, 5
LDI R17, 10
ADD R16, R17
; R16 = 15
para agregar R16 y R17 y poner el resultado en R16. Para agregar números de 16 bits, básicamente solo haces esto varias veces. Sin embargo, hay un retén: el bit de acarreo. Otra instrucción AVR es ADC, para ADd con Carry. Esto hace exactamente lo mismo que ADD, pero también agrega el indicador de acarreo. Tanto ADD como ADC establecerán el indicador de acarreo si la operación de adición se desborda. Por ejemplo, si agrega 128 a 128, obtiene 0 como resultado con el indicador de acarreo establecido. Si llama a ADC con el indicador de acarreo establecido, agregará 1 al resultado. Aquí hay un ejemplo de adición de 16 bits:
LDI R16, 232
LDI R17, 3
; R17:R16 = 1000
LDI R18, 208
LDI R19, 7
; R19:R18 = 2000
ADD R16, R18
ADC R17, R19
; R16 = 184
; R17 = 11
; R17:R16 = 3000
Esto se puede repetir tantas veces como sea necesario para agregar números grandes. Tenga en cuenta que se requiere una pequeña cantidad de lógica para admitir esto: la capacidad de introducir el indicador de acarreo en el arrastre del sumador.
Se puede usar un proceso similar para multiplicar números. La realización de multiplicaciones de 16 bits en un procesador de 8 bits requiere 4 multiplicaciones de 8 bits y varias adiciones. El procedimiento es exactamente el mismo que multiplicar números por mano un dígito a la vez, excepto que usas bytes en lugar de dígitos. Deberá multiplicar los cuatro pares de bytes posibles y luego agregarlos de acuerdo con sus valores de posición. Ejemplo en AVR ASM:
LDI R16, 232
LDI R17, 3
; R17:R16 = 1000
LDI R18, 208
LDI R19, 7
; R19:R18 = 2000
MUL R16, R18
; R1:R0 = R16*R18 (1s place product)
MOVW R3:R2, R1:R0
; R3:R2 = R16*R18
MUL R16, R19
; R1:R0 = R16*R19 (256s place product #1)
CLR R4
ADD R3, R0
ADC R4, R1
; R4:R3:R2 = R16*R18 + 256*R16*R19
MUL R17, R18
; R1:R0 = R17*R18 (256s place product #2)
ADD R3, R0
ADC R4, R1
; R4:R3:R2 = R16*R18 + 256*(R16*R19+R17*R18)
MUL R17, R19
; R1:R0 = R17*R19 (65536s place product)
CLR R5
ADD R4, R0
ADC R5, R1
; R5:R4:R3:R2 = R16*R18 + 256*(R16*R19+R17*R18) + 65536*R17*R19
; R5:R4:R3:R2 = 2000000
Notará que es exactamente así como trabaja con números en papel a mano, pero en lugar de trabajar con 10 dígitos de base, la CPU trabaja con bloques de bits del tamaño de palabras, en este caso, 8 bits.
Si usa una CPU que puede trabajar con más bits a la vez, trabajar con números grandes se vuelve más fácil ya que requiere menos instrucciones. Sin embargo, puede usar las mismas técnicas para trabajar con números más grandes de lo que el conjunto de instrucciones admite directamente.