Если вы уверены, что unsigned int
имеет как минимум 4 байта в вашей целевой системе (это не гарантировано!), Вы можете сделать:
unsigned short one = static_cast<unsigned short>(original >> (2 * 8));
unsigned short two = static_cast<unsigned short>(original % (1 << (2 * 8)));
Это только гарантированно сработает, если исходное значение действительно содержит только 4-байтовое значение (возможно, с дополнением нулями впереди). Если вы не любите битшифтинг, вы также можете сделать
uint32_t original = 0x4f07aabb; // guarantee 32 bits
uint16_t parts[2];
std::memcpy(&parts[0], &original, sizeof(uint32_t));
unsigned short one = static_cast<unsigned short>(parts[0]);
unsigned short two = static_cast<unsigned short>(parts[1]);
. Это даст два значения в зависимости от порядка байтов целевой системы; на архитектуре с прямым порядком байтов результаты обратные. Вы можете проверить порядок байтов в следующих C ++ 20-х std::endian::native
.