小端模式和大端模式
来源:互联网 发布:粤嵌培训怎么样知乎 编辑:程序博客网 时间: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]=400=00 00 01 90H
这正好是内存里内容的反字节存放!!!
接下来是一个指针运算,c变成char类型的指针,+1就是往后移动一个char类型大小,再转换成int指针,所以它后面的4个字节归它管。
所以a数组输出为
总算知道什么是小端大端了。。。
0 0
- 大端和小端模式
- 大端模式和小端模式
- 大端模式和小端模式
- 大端模式和小端模式
- 解析大端模式和小端模式
- 解析大端模式和小端模式
- 关于大端模式和小端模式
- 大端模式和小端模式
- 大端模式和小端模式
- 解析大端模式和小端模式
- 解析大端模式和小端模式
- 解析大端模式和小端模式
- 理解大端模式和小端模式
- 大端模式和小端模式
- 解析大端模式和小端模式
- 大端模式和小端模式
- 解析大端模式和小端模式
- 大端模式和小端模式
- MBED移植日记:exti_api(基于STM32F107RC,适用于C)
- WaitForSingleObject&WaitForMultipleObjects
- Xcode8去掉控制台无用打印信息
- 左边列表移到到右边列表
- leetcode 85. Maximal Rectangle
- 小端模式和大端模式
- RecyclerView详解 —— 自定义动画
- 二查平衡树的插入与删除(四种旋转)
- 15.2、SQLiteOpenHelper
- 《JAVA与模式》之调停者模式
- willDisplayCell 和cellForRowAtIndexPath区别
- Android性能优化总结
- codevs 1183 泥泞的道路(spfa+二分答案)
- 新人,初来报道!