大小端对齐

int *num=(int*)"abcd";
printf("%x\n",*num );

闲来无事,写了上面的两句代码,*num会打印出什么呢?
一般分析:根据ansii码,转换成十六进制,为61626364
可是输出结果为:64636261
我们可能会怀疑指针num,
printf出地址后,它和a[0]的地址一样。
然后,可能会怀疑printf函数的问题。
还有可能是堆上的问题,毕竟函数是在堆上开辟的空间。
、、、然后,对以上怀疑进行了一一验证,均不是。
这时候突然想起了处理器大端小端的问题。
不同的处理器有不同的字节序类型,当然,这是对一个基本类型而言的。
比如:将num指向“abcd”的地址空间后,这里被看做是一个int的整体,那么处理器是怎么读出这个int来的呢,a->b->c->d还是相反?
首先从a到d地址是由低字节到高字节的。
对于小端对齐(little endian)
地址的低(高)位存储值的低(高)位  //值的位即个、十、百、千、万、、、
大端对齐(big endian)
地址的高(低)位存储值的低(高)位 //个人觉得这样的还是比较符合自己的思维,直观明了
我们intel的x86系列的cpu都是小端对齐,因此现在也比较清楚为什么例子中输出的是64636261了


一般,我们判断机器是大端还是小端对齐,用得最常见是共用体。


union test
{
    int a;
    char b;
};
int main()
{
    union test t;
    t.a=0x12345678;
    printf("%x\n",t.b);
}

打印结果为:

首先我们应该知道b应该取的是a的低字节
然后,根据打印出的是78,知道这也是值的低位,因此当前cpu是小端对齐的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值