Patrón de bits lógicos (bits de representación de valores), es decir, los valores de dígitos binarios solo se pueden conservar si el valor firmado original no fue negativo, porque los valores negativos no se pueden representar con una variable entera sin signo. Todo lo que necesita hacer es asignar su valor con signo a su objeto entero sin signo y ya está
uint64_t u_val = s_val;
una conversión explícita no es necesario, pero podría usarse para suprimir las advertencias del compilador.
En cuanto al patrón de bits físicos (es decir, lo que ve en la memoria sin procesar, bits de representación de objetos), simplemente no puede "convertirlo" de esa manera. El lenguaje C++ no le proporciona ningún método de conversión que le garantice preservar el patrón de bits físicos.Todo lo que puede hacer es reinterpretar la memoria ocupada por el objeto firmado como un objeto sin firma del mismo tamaño
STATIC_ASSERT(sizeof(int64_t) == sizeof(uint64_t));
uint64_t u_val = reinterpret_cast<uint64_t&>(s_val);
Una vez más, esto no es una conversión, sino más bien una reinterpretación de la memoria. Esto no está garantizado para funcionar y esto es generalmente ilegal.
Votos para todos; Gracias por tu contribución. Creo que static_cast es, de hecho, la respuesta correcta. Para que conste, lo había intentado primero, pero debido a un error grave en otra parte, pensé que no estaba preservando el patrón de bits. Para aclarar la pregunta, está bien que s_val! = U_val (que será el caso si s_val <0). Los bits son lo que importa. – bbg