小端模式和大端模式

来源:互联网 发布:粤嵌培训怎么样知乎 编辑:程序博客网 时间:2024/05/16 05:11

小端模式和大端模式

以前对大端小端只有个模糊的印象,直到在某个程序中遇见了存储问题……
代码来源于mit6.828 lab1实验里的小例子. [ 6.828 lab1 ]

小端模式
在小端存储格式中,低地址中存放的是数据的低字节,高地址存放的是数据的高字节。
大端模式
与小端模式相反,高地址中存放的是数据的高字节,低地址中存放的是数据的低字节。

pointer.c

#include <stdio.h>#include <stdlib.h>voidf(void){    int a[4];    int *b = malloc(16);    int *c;    int i;    printf("1: a = %p, b = %p, c = %p\n", a, b, c);    c = a;    for (i = 0; i < 4; i++)    a[i] = 100 + i;    c[0] = 200;    printf("2: a[0] = %d, a[1] = %d, a[2] = %d, a[3] = %d\n",       a[0], a[1], a[2], a[3]);    c[1] = 300;    *(c + 2) = 301;    3[c] = 302;    printf("3: a[0] = %d, a[1] = %d, a[2] = %d, a[3] = %d\n",       a[0], a[1], a[2], a[3]);    c = c + 1;    *c = 400;    //////////////////////////////////检查内存部分1///////////////////    printf("4: a[0] = %d, a[1] = %d, a[2] = %d, a[3] = %d\n",       a[0], a[1], a[2], a[3]);    c = (int *) ((char *) c + 1);//sizeof(int)=4,sizeof(char)=1    *c = 500;    //////////////////////////////////检查内存部分2///////////////////    printf("5: a[0] = %d, a[1] = %d, a[2] = %d, a[3] = %d\n",       a[0], a[1], a[2], a[3]);    b = (int *) a + 1;    c = (int *) ((char *) a + 1);    printf("6: a = %p, b = %p, c = %p\n", a, b, c);}intmain(int ac, char **av){    f();    return 0;}

第二张图片的结果和我算出来的结果不一样,打开memory视图,查看第四个printf函数时a[1]地址里放了什么。我的a[1]地址是0x0018fee8.
a[1]内存内容
而a[1]=400=00 00 01 90H
这正好是内存里内容的反字节存放!!!
接下来是一个指针运算,c变成char类型的指针,+1就是往后移动一个char类型大小,再转换成int指针,所以它后面的4个字节归它管。
*c=500内存变化
所以a数组输出为
输出
总算知道什么是小端大端了。。。

0 0
原创粉丝点击