大小端序问题
来源:互联网 发布:linux退出help命令 编辑:程序博客网 时间:2024/06/06 08:53
大端模式
所谓的大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在大端模式下,前32位应该这样读: e6 84 6c 4e ( 假设int占4个字节)
记忆方法: 地址的增长顺序与值的增长顺序相反
小端模式
所谓的小端模式(Little-endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在小端模式下,前32位应该这样读: 4e 6c 84 e6( 假设int占4个字节)
记忆方法: 地址的增长顺序与值的增长顺序相同
大端序机器:数据的高位先存储;
小端序机器:数据的低位先存储;
代码:
运行结果:
#include <stdio.h>#include <stdbool.h>#define DEBUG_TESTenum endian{Big_endian,/* 0,大端序 */Little_endian/* 1,小端序 */};/********************************************************* *@function:判断一个机器是不是小端序 *@param(in):无(void) *@return:布尔型:返回1,小段序;返回0,大端序; *******************************************************/#ifndef UNION_ENDIANbool isLittle_endian(void){unsigned int word = 0x12345678;unsigned char byte0 = *((unsigned char *)&word + 0);#ifndef DEBUG_TESTunsigned char byte1 = *((unsigned char *)&word + 1);unsigned char byte2 = *((unsigned char *)&word + 2);unsigned char byte3 = *((unsigned char *)&word + 3);unsigned int *Pint = &word;unsigned char *Pchar0 = &byte0;unsigned char *Pchar1 = &byte1;unsigned char *Pchar2 = &byte2;unsigned char *Pchar3 = &byte3;printf("%p : word = 0x%x\n",Pint,word);printf("%p : byte0 = 0x%x\n",Pchar0,byte0);printf("%p : byte1 = 0x%x\n",Pchar1,byte1);printf("%p : byte2 = 0x%x\n",Pchar2,byte2);printf("%p : byte3 = 0x%x\n",Pchar3,byte3);#endifif(byte0 == 0x78){//printf("little endian\n ");return (Little_endian);}else{//printf("big endian\n");return (Big_endian);}}#elsebool isLittle_endian(void){union A{unsigned int word;unsigned char byte;};union A un;un.word = 0x12345678;if(un.byte == 0x78){return (Little_endian);}else{return (Big_endian);}}#endif#ifdef DEBUG_TESTint main(void){bool ret;ret = isLittle_endian();if(ret == 0){printf("ret = %d , big endian machine\n",ret);}else{printf("ret = %d ,little endian machine\n",ret);}return 0;}#endif
0 0
- 大小端序问题
- 大小端,字节序问题
- 大小端字节序问题
- 大小端字节序问题
- 大小端、字节序问题
- 字节序问题--大小端问题
- 字节序网络序大小端问题
- 字节序问题——大小端
- 大小端、网络字节序问题
- 大小端、网络字节序问题
- 大小端、网络字节序问题
- 大小端、网络字节序问题
- 大小端、网络字节序问题
- 字节序问题:大小端的判定
- 大小端、网络字节序问题
- 大小端、网络字节序问题
- 字节序的大小端问题
- 大小端、网络字节序问题
- Spring学习1-概述
- 使用Toolbar + DrawerLayout快速实现单侧滑
- JAVA 面试,你常常忘记它们
- scrapy一个综合性的demo案例
- Matlab与线性代数 -- 矩阵的重组5
- 大小端序问题
- 一气呵成的需求文档,要清楚3点撰写思路和这些小tips
- node.js第三天
- Steam VR SDK学习笔记(一)
- QuickContactBadge联系人学习
- 使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件
- artdialog对话框拖拽问题
- gdb调试
- Qt-vs-addin卸载