A diferencia del Python, que tiene un tipado dinámico, C y todos los lenguajes relacionados, tienen un tipado fuerte. Corre por tu cuenta reservar el tamaño de memoria que necesitas.
Por ejemplo:
void setup() {
Serial.begin(9600);
unsigned long t;
int a=3000;
int b=3000;
t= a*b;
Serial.println(t);
t= (unsigned long)a*(unsigned long)b;
Serial.println(t);
t= 3000*3000;
Serial.println(t);
t= 3000UL*3000UL;
Serial.println(t);
}
void loop() {}
Da como resultado
21568
9000000
21568
9000000
Cuando haces dos operaciones con int el compilador no te asignara el resultado a un tipo de variable "que entre" (a diferencia de Phyton) a pesar que después el resultado se los asignes a a una variable "donde entre". Cuando tu resultado es un unsigned long, todos los operandos de la función tienen que ser unsigned long (hay excepciones pero mejor hacerlo así ) .
Saludos