Si podes crear una "variable" de 128 bits, el tema esta en que no se si vas a poder hacer operaciones de 128 bits ya que C no permite el overload de los operandos ( +,*,/,-,[],etc).
Como decis una estructura y podes tener los 128 bits, e iniciar una "variable" de esa forma
typedef struct uint128_t {
uint32_t valor[4];
} uint128_t;
Tambien podes crear una union, si es que ademas deseas por ejemplo acceder a bytes y no solo variables de 32 bits.
lo cual vas a poder hacer:
uint128_t variable128numero1, variable128numero2;
Pero NO vas a poder hacer:
variable128numero1 = variable128numero2 + 10;
Ni rotarlo, por que son 4 de 32bits. Y vas a tener que crear una funcion para la asignacion, suma, rotacion, etc , ejemplo:
void suma128 ( uint128_t *var1, uint128_t *var2)
Realmente aparte de C++ no conozco otra forma de como es que podria hacerse. En C++ podrias crear tu libreira y hacerle un overload a esos operandos para que funcionen "por fuera" (para vos ) como una variable gigante de 128 bits y en C solo me queda pensar en funciones.
---------------------
GCC admite el uso de
unsigned __int128_t
Pero ....
6.8 128-bit Integers
As an extension the integer scalar type __int128 is supported for targets which have an integer mode wide enough to hold 128 bits. Simply write __int128 for a signed 128-bit integer, or unsigned __int128 for an unsigned 128-bit integer. There is no support in GCC for expressing an integer constant of type __int128 for targets with long long integer less than 128 bits wide.
-----------------------------
Creo que eso es lo que preguntabas...