文章目录
实验
int 类型大小正常为4Byte
以小端序来看 0x12345678在内存中的存储为
csharp
0x78 0x56 0x34 0x12
0x78在低地址,0x12在高地址
程序输出
csharp
#include <stdio.h>
#include <string.h>
#include<windows.h>
int main()
{
int a = 0x12345678;
printf("LOWORD %x\n",LOWORD(a));
printf("HIWORD %x\n",HIWORD(a));
printf("LOBYTE %x\n",LOBYTE(a));
printf("HIBYTE %x\n",HIBYTE(a));
}
csharp
LOWORD 5678
HIWORD 1234
LOBYTE 78
HIBYTE 56
结论
可以看到以WORD结尾的是取出两个字节
BYTE结尾取出一个字节
LOWORD 是取出内存中低地址的前两个字节
HIWORD 是取出内存中高地址的后两个字节
LOBYTE 取出了内存中最低的一个字节0x78
HIBYTE 取出了第二个字节0x56
从这里来看,他们是以两个字节为操作对象,哪怕给出的数据是int类型的数据
按照我的猜测以WORD结尾的就是以4个字节为操作对象了
以下是测试
csharp
#include <stdio.h>
#include <string.h>
#include <windows.h>
int main()
{
unsigned long long a = 0x123456789abcdef0;
printf("long long -> %x\n", sizeof(unsigned long long));
printf("LOWORD %x\n", LOWORD(a));
printf("HIWORD %x\n", HIWORD(a));
printf("LOBYTE %x\n", LOBYTE(a));
printf("HIBYTE %x\n", HIBYTE(a));
}
此时a在内存中的表示为
csharp
0xf0 0xde 0xbc 0x9a 0x78 0x56 0x34 0x12
输出结果为
csharp
long long -> 8
LOWORD def0
HIWORD 9abc
LOBYTE f0
HIBYTE de
看来和我们的猜想一致