Windows内存心得
Windows的内存中,数据的存储并不是像我们想象的那样,它涉及从高位读和从低位读的问题。
例如:LONG x1=0x12345678, x1在内存中显示为78 56 34 12;
WORD x2=0x1234, x2在内存中显示为34 12
即,windows已经定义的数据类型,以BYTE为单位,从高到低在内存中显示(BYTE内数据的高低位不交换)。
但是如果出现下面的情形时,结果如何呢?
typedef struct Data2Cal
{
BYTEbySignal : 4;
BYTEbyData2Cal1 : 4;
BYTEbyData2Cal2 : 4;
BYTEbyData2Cal3 : 4;
}DATA2CAL;
DATA2CAL data2Cal;
data2Cal. bySignal = 0x1
data2Cal. byData2Cal1 = 0x2;
data2Cal. byData2Cal2 = 0x3;
data2Cal. byData2Cal3 = 0x4;
那么在内存中,data2Cal显示为什么呢?
经过测试,data2Cal显示为21 43
typedef struct Data1Cal
{
BYTEbySignal : 1;
BYTEbyData2Cal1 : 1;
BYTEbyData2Cal2 : 1;
BYTEbyData2Cal3 : 1;
BYTEbyData2Cal4 : 1;
BYTEbyData2Cal5 : 1;
BYTEbyData2Cal6 : 1;
BYTEbyData2Cal7 : 1;
}DATA1CAL;
DATA1CAL data1Cal;
data1Cal. bySignal = 1;
data1Cal. byData2Cal1 = 0;
data1Cal. byData2Cal2 = 1;
data1Cal. byData2Cal3 = 0;
data1Cal. byData2Cal4 = 0;
data1Cal. byData2Cal5 = 1;
data1Cal. byData2Cal6 = 0;
data1Cal. byData2Cal7 = 1;
那么在内存中,data1Cal显示为什么呢?
经过测试,data2Cal显示为A5
typedef struct Data1Cal
{
BYTEbySignal : 1;
BYTEbyData2Cal1 : 3;
BYTEbyData2Cal2 : 1;
BYTEbyData2Cal3 : 3;
}DATA1CAL;
DATA1CAL data1Cal;
data1Cal. bySignal = 1;
data1Cal. byData2Cal1 = 3;
data1Cal. byData2Cal2 = 1;
data1Cal. byData2Cal3 = 2;
那么在内存中,data1Cal显示为什么呢?
经过测试,data2Cal显示为57
由上可见:
当把BYTE拆开使用时,windows不仅把临近的两个分量高低位互换,而且把高4位和低4位互换, 它的高低字节并不交换.
typedef struct Data1Cal
{
BYTEbySignal;
BYTEbyData2Cal1;
}DATA1CAL;
DATA1CAL data1Cal;
data1Cal. bySignal = 0x12;
data1Cal. byData2Cal1 = 0x34;
那么在内存中,data1Cal显示为什么呢?
经过测试,data2Cal显示为12 34
即:自定义的结构体未拆分BYTE,显示也不同与基本类型,它的高低字节并不交换。