Capturar y calcular el desbordamiento durante la multiplicación de dos enteros grandes

Estoy buscando una solución eficiente (opcionalmente estándar, elegante y fácil de implementar) para multiplicar números relativamente grandes, y almacenar el resultado en uno o varios enteros:

Digamos que tengo dos enteros de 64 bits declarados así:

uint64_t a = xxx, b = yyy; 

Cuando lo hagoa * b, ¿cómo puedo detectar si la operación produce un desbordamiento y, en este caso, almacenar el acarreo en algún lugar?

Tenga en cuenta queNo quiero usar ninguna biblioteca de números grandes ya que tengo restricciones en la forma en que almaceno los números.