Agregando mis 10 centavos a esta respuesta:
u64
significa un valor de '64 bits sin firmar', por lo que, dependiendo de la arquitectura en la que se ejecutará/se compilará el código, debe definirse de manera diferente para que realmente tenga una longitud de 64 bits.
Por ejemplo, en una máquina x86, un unsigned long
tiene una longitud de 64 bits, por lo que u64
para esa máquina podría definirse de la siguiente manera:
typedef unsigned long u64;
Lo mismo aplica para u32
. En una máquina x86, unsigned int
tiene una longitud de 32 bits, por lo que u32
para esa máquina podría definirse de la siguiente manera:
typedef unsigned int u32;
Generalmente encontrarás el typedef
declaración para estos tipos en un types.h
archivo que corresponde a la arquitectura en la que está compilando su fuente.
A menudo, cuando se trabaja cerca del hardware o cuando se intenta controlar el tamaño/formato de una estructura de datos, es necesario tener un control preciso del tamaño de los números enteros.
En cuanto a u8
contra uint8_t
, esto se debe simplemente a que Linux es anterior a <stdint.h>
está disponible en C, que técnicamente es un C99-ism, pero en mi experiencia está disponible en la mayoría de los compiladores modernos, incluso en sus modos ANSI-C/C89.