大端与小端

来源:互联网 发布:水果店淘宝首页模板 编辑:程序博客网 时间:2024/06/10 03:13

前两天看到大端小端时,

小端:低字节的值在前,高字节的值在后

大端:高字节的值在前,低字节的值在后

看到一个c的语言题,不是很清楚:

 

#include <stdio.h>

int main()
{
       
    int a[5] = {1, 2, 3, 4, 5};

    int* ptr1 = (int*)(&a + 1);   
    int* ptr2 = (int*)((int)a + 1);
     
    printf("%x, %x/n", ptr1[-1], *ptr2);
      
    return 0;
}

 

输出:

5, 2000000

对于输出5,比较好理解。&a是一个指向数组a的指针,也就是一个二级指针。至于为什么会是这样,我也不是很清楚了,
     后面的&a + 1相当于 address(a[0]) + sizeof(int) * 5,也与此相关。
但输出2000000就不明白了。由于是与大小端相关的题目,我就先看看我的机子是大端还是小端,用的方法,很普遍的那种:
typedef union un_t1
{
    int i;
    char ch;
}un;

    un u1;
    u1.i = 1;
    if(u1.ch == 1)
        printf("It is littleendian./n");
    else
        printf("It is big endian./n");
结果,我的机子是小端的。
假设a[0]的地址是1,则在我的机子上,数组a的内存分布如下:
1   2   3   4      5   6   7   8      9   10  11  12    13  14  15  16
01 00 00 00    02 00 00 00    03 00  00  00    04  00  00  00
则ptr2=2,又因为我的机子的字长为4个字节,所以*ptr2会一次读取2 3 4 5这四个字节的值
00 00 00 02,按照小端的内存分布规则----低字节的值在前,高字节的值在后----,所以*ptr2
的值为2000000。按照这种思维,测试一下:
int* ptr2 = (int*)((int)a + 2);  *ptr2 = 20000
int* ptr2 = (int*)((int)a + 3);  *ptr2 = 200
int* ptr2 = (int*)((int)a + 4);  *ptr2 = 2
int* ptr2 = (int*)((int)a + 5);  *ptr2 = 3000000
果然与我预期一致。



原创粉丝点击