Отрицательное 32-разрядное целое число будет расширено до 64-разрядного знака.
#include <stdint.h>
uint64_t movsx(int32_t X) { return X; }
movsx на x86-64:
movsx:
movsx rax, edi
ret
Маскировка старших 32-разрядных удалит, потому что это будет только расширение нуля:
#include <stdint.h>
uint64_t mov(int32_t X) { return (uint64_t)X & 0xFFFFFFFF; }
//or uint64_t mov(int32_t X) { return (uint64_t)(uint32_t)X; }
mov на x86-64:
mov:
mov eax, edi
ret
https://gcc.godbolt.org/z/fihCmt
Ни один из методов не теряет никакой информации из младших 32-битных данных, поэтому любой из методов является допустимым способом сохранения 32-битного целого в 64-битном.
Код x86-64 для простого mov
на один байт короче (3 байта против 4). Я не думаю, что должна быть большая разница в скорости, но если она есть, я бы ожидал, что равнина mov
выиграет чуть-чуть.