The ATmega328P is 8-bits, but that doesn't hold back the avr-gcc compiler.
The avr-gcc compiler supports:
Integers : 8, 16, 32 or even 64 bits. Signed and unsigned.
Float : only 32 bits in software. The keyword 'double' is translated into 'float'.
The 'float' library for the avr-gcc is highly optimized. It is very fast.
I think it should be possible to add a 64-bit floating point library, but I don't know if that has been done for 8-bits ATmega chips.
There are libraries to do more.
For example BigNumber : Gammon Forum : Electronics : Microprocessors : Arbitrary precision (big number) library port for Arduino
Test if the avr-gcc compiler really support 64 bits integers (spoiler: yes, it does)
// Tested with Arduino IDE 1.6.10 and Arduino Micro (ATmega32U4).
void setup()
{
Serial.begin( 9600);
while(!Serial); // wait for serial monitor for Leonardo/Micro
Serial.println("64 bit integers");
// 64 bits is 16 hex digits
// 0123456789012345
int64_t a = 0x7777777777777777LL;
uint64_t b = 0xAAAAAAAAAAAAAAAAULL;
long long c = 0x0123456789ABCDEFLL;
unsigned long long d = 0x212320242F252E26ULL;
print64BitsAsHex( a); Serial.println();
print64BitsAsHex( b); Serial.println();
print64BitsAsHex( c); Serial.println();
print64BitsAsHex( d); Serial.println();
uint64_t e = c * d;
print64BitsAsHex( e); Serial.println();
uint64_t f = b + d;
print64BitsAsHex( f); Serial.println();
}
void loop()
{
}
void print64BitsAsHex( uint64_t x)
{
char buffer[16];
for( int i=0; i<16; i++)
{
buffer[15-i] = x & 0x0F; // get the lowest nibble
x >>= 4;
}
Serial.print("0x");
for( int i=0; i<16; i++)
{
byte b = buffer[i];
if( b < 0x0A)
b += '0';
else
b += 'A' - 0x0A;
Serial.write(b);
}
}