struct
{
short
char
long
char
short
}message;
用这样一个结构来传递消息貌似非常方便,
1.内存地址对齐
2.大小端定义
本文先介绍内存地址对齐和大小端的概念,
内存地址对齐
洋名叫做"
大部分16位和32位的CPU不允许将字或者长字存储到内存中的任意地址。
实际上,
1)
2)
3)
不同CPU的对其规则可能不同,
为什么会有上述的限制呢?
CPU通过地址总线来存取内存中的数据,32位的CPU的地址总线宽度既为32位置,
再看看刚才的message结构,
用sizeof(message)看吧。
message会被编译器改为下面的形式:
struct
{
short
char
char
//
long
char
char
short
char
//
};
如果不同的编译器采用不同的对齐规则,
大端(Big
Byte
对于数据中跨越多个字节的对象,
(1)
(2)
针对第一个问题,有这样的解释:
对于跨越多个字节的对象,一般它所占的字节都是连续的,
比如:
上面只是内存字节组织的一种情况:
[Xw-1,
它的MSB
LSB和MSB谁位于内存的最低地址,
如果LSB在MSB前面,
举个例子来说名大小端:
0x01234567的MSB为0x01,
认清这样一个事实:
两个测试Bit
method_1
int
{
int
if
{
printf("little
}
else
printf("big
return
}
int
method_2
int
{
union
{
short
char
}un;
un.n
if
printf("big
else
printf("little
else
printf("error!\n");
return
}
union中元素的起始地址都是相同的——位于联合的开始。
区分大端与小端有什么用呢?