C++ 使用位移位运算符将DWORD转换为字节

C++ 使用位移位运算符将DWORD转换为字节,c++,C++,我不能让它正常工作 #include <windows.h> int main() { DWORD i = 6521; BYTE first = i >> 32; BYTE second = i >> 24; BYTE third = i >> 16; BYTE fourth = i >> 8; i = (((DWORD)fourth) << 24) | (((DWOR

我不能让它正常工作

#include <windows.h>

int main()
{
    DWORD i  = 6521;

    BYTE first = i >> 32;
    BYTE second = i >> 24;
    BYTE third = i >> 16;
    BYTE fourth = i >> 8;

    i = (((DWORD)fourth) << 24) | (((DWORD)third) << 16) | (((DWORD)second) << 8) | first;
}
#包括
int main()
{
德沃德一世=6521;
字节优先=i>>32;
字节秒=i>>24;
第三字节=i>>16;
第四字节=i>>8;

i=((DWORD)第四个)我认为你的DWORD移位太多了。移位8位太多:)

你的移位不太正确


字节优先=i>>24;
字节秒=i>24;
第三字节=i>24;
第四字节=i>24;

我所做的是将顶部字节下移24位,然后以8的增量上移以清除顶部位,并将下一个字节置于下移位置


您也可以将dword处的值作为4字节的字节数组(或结构)来读取,并让编译为您完成这项工作。

虽然Neil的解决方案是正确的,但字节的顺序并不总是与您期望的顺序一致。您可能想看看“”如果您有这个问题

除了移位过多的8位之外,您还以相反的顺序重建了
i
(这可能是有意的)。最好对固定大小的整数类型使用uint32_t和uint8_t。呸,我的答案会运行得更快。少一个操作。在带有移位优化的ARM程序上更好:)@MichaelDorgan:您的操作更容易混淆,并且似乎是相同数量的操作。所以不要更快。如果您愿意,字节前移的位移位需要修复。
BYTE first = (i >> 24) & 0xff;
BYTE second = (i >> 16) & 0xff;
BYTE third = (i >> 8) & 0xff;
BYTE fourth = i & 0xff ;

BYTE first  = i         >> 24;
BYTE second = i <<  8   >> 24;
BYTE third  = i <<  16  >> 24;
BYTE fourth = i <<  24  >> 24;