cpu对编程的影响


    由于cpu设计的不同,所以在cpu之间通信的时候有些地方需要注意,常见的主要是字节序和字节对齐问题.


I. 字节序

几乎所有的机器上,多字节对象都被存储为连续的字节序列。

现在有两颗不同架构的cpu芯片, 分别是低有效位被优先存储的cpu1(小端序)和高有效位被优先存储的cpu2(大端序)

内存数据:

0x804800000x804800010x804800020x80480003
0x120x340x560x78

从内存地址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/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值