由于cpu设计的不同,所以在cpu之间通信的时候有些地方需要注意,常见的主要是字节序和字节对齐问题.
I. 字节序
几乎所有的机器上,多字节对象都被存储为连续的字节序列。
现在有两颗不同架构的cpu芯片, 分别是低有效位被优先存储的cpu1(小端序)和高有效位被优先存储的cpu2(大端序)
内存数据:
0x80480000 0x80480001 0x80480002 0x80480003 0x12 0x34 0x56 0x78 从内存地址0x80480000读取一个字节时,cpu1和cpu2读取的结果都是0x12;
从内存地址0x80480000读取两个字节时,cpu1读取的结果是0x3412,而cpu2读取的结果是0x1234;
这样就产生了所谓的字节序问题,只有读取大于2个字节的时候才会涉及字节序的问题。
//简单判断当前机器的字节序
int main(void)
{
int iNum = 0x04030201;
char *pcNum = &iNum;
if (*pcNum == 0x04)puts("big edum\n");
else
puts("small edum\n");
return 0;
}
II. 字节对齐
1. 基本数据类型的自身对齐值
char --> 1
short --> 2
int, float, long --> 4
double, long long --> 8
2. 结构体或者类的自身对齐值:
其数据成员中自身对齐值最大的那个值。
3. 数据成员、结构体和类的有效对齐值:
自身对齐值和指定对齐值中小的那个值。
4. 指定对齐值:
#pragma pack (2) /* 指定按2字节对齐 */
/* 结构体定义 */
struct C {
char b;
int a;
short c;
};
#pragma pack () /* 取消指定对齐,恢复缺省对齐 */
说明:
* 有效对齐值很重要,是最终用来决定数据存放地址方式的值。有效对齐值为N就表示该数据的存放起始地址%N=0。
* 对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐//补齐
* 对于数组,比如:char a[3];它的对齐方式和分别写3个char是一样的.也就是说它还是按1个字节对齐.
* 如果写: typedef char Array3[3];Array3这种类型的对齐方式还是按1个字节对齐,而不是按它的长度.
* 不论类型是什么,对齐的边界一定是1,2,4,8,16,32,64….中的一个
相关文章推荐 http://blog.csdn.net/liuxingen/article/details/45420455/