这已经是一个被说得很烂的一个话题了,今天我想在这一篇文章补充一些细节上的东西,供备忘!

  在看这篇文章之前,请先仔细看下链接这篇博文,关于字节序说得很详细!http://blog.chinaunix.net/uid-25367385-id-188322.html

  在今天,碰到了这样一条语句:

#define get16bits(d) (*((const uint16_t *) (d)))

  很明显宏参数d必须是一个指针,它可以是位数大于等于16位的类型指针,short int、long int,甚至是float或double,只要有需求就可以。

 1 #include "stdio.h"
 2
 3 typedef unsigned short uint16_t;
 4 #define get16bits(d) (*((const uint16_t *) (d)))
 5
 6 int _tmain(int argc, _TCHAR* argv[])
 7 {
 8     //如果为小端字节序,那么读出来的是0x0001;如果为大端字节序,读出来的是0xFFFFF
 9     int d = 0xFFFF0001;    //int占4个字节
10     int *p = &d;
11     uint16_t a = get16bits(p);
12     printf("%d", a);
13     return 0;
14 }

  为什么上面的代码在不同的机器上面可能会得到不同的结果呢?

  下面将解释为什么CPU为小端字节序时,读出来的是0x0001。

  这一篇文章,唯一想说的是p指向的是d所在内存单元的最低地址而已!

  

  小端字节序的机器在存储0xFFFF0001这4个字节的数据时,它是按照上面的形式存储的。

  在代码中(*((const uint16_t *) (p))),p被转化成指向16位的整形指针,此时对这16位的整形指针解引用,它读出来的也就是16位数据,而不是原来的32位了,这也就是指针类型转换的作用了。我们假设p指针指向的是内存单元的高地址,那么小端字节序的机器读出来会是0xFF,所以这一假设是错误的,p指针指向的是内存单元的低地址!

  总结一下:在讲解字节序的同时,也要注意强调指针是指向内存单元低地址,否则有时会引起一些误解。

  本文链接:http://www.cnblogs.com/cposture/p/4490828.html

转载于:https://www.cnblogs.com/cposture/p/4490828.html

【原创】大端和小端字节序的细节相关推荐

  1. 如何确定CPU是大端字节序还是小端字节序?

    大端字节序:高字节存放在低地址,低字节存放在高低址 小端字节序:低字节存放在高低址,高字节存放在低地址 大小端字节顺序它是CPU的属性,所哟不同的CPU的大小端字节顺序也不同,移植的时候需要先判断当前 ...

  2. 计算机网络——网络字节序(大端字节序(Big Endian)\小端字节序(Little Endian))

    网络字节序 网络字节序 1.网络字节序 (Network Byte Order)和本机转换 2.字节序转换函数 网络字节序 1.网络字节序 (Network Byte Order)和本机转换 1.大端 ...

  3. 小端字节序与大端字节序

    端模式分为:小端字节序和大端字节序,也就是字节在内存中的顺序. 小端字节序:低字节存于内存低地址:高字节存于内存高地址.如一个long型数据0x12345678 0x0029f458 0x78 0x0 ...

  4. java 大端字节序_理解字节序 大端字节序和小端字节序

    以下内容参考了 http://www.ruanyifeng.com/blog/2016/11/byte-order.html https://blog.csdn.net/yishengzhiai005 ...

  5. 【转】理解字节序 大端字节序和小端字节序

    转自:https://www.cnblogs.com/gremount/p/8830707.html 以下内容参考了 http://www.ruanyifeng.com/blog/2016/11/by ...

  6. 大端字节序与小端字节序的转换

    逐步加深对字节操作的理解,记录一下大端字节序与小端字节序的转换,开发环境是vs2010,项目类型是控制台输出程序,下面是代码实现: // ByteOrder_demo.cpp : 定义控制台应用程序的 ...

  7. 小端字节序和大端字节序

    端模式分为:小端字节序和大端字节序,也就是字节在内存中的顺序. 需要注意的是,对于数据来说,高字节是指最高位字节,即左边第一位! 小端字节序:低字节存于内存低地址:高字节存于内存高地址.如一个long ...

  8. 大端字节序小端字节序(网络字节序主机字节序)

    大端字节序:整数的高位字节存储在内存的低地址处,低字节存储在内存的高地址处. 小端字节序:整数的高位字节存储在内存的高地址处,低字节存储在内存的低地址处. 一般pc大多采用小端字节序,也称为主机字节序 ...

  9. 大端字节序和小端字节序

    大端字节序和小端字节序 1.什么是大小端字节序 2.验证大小端字节序 1.什么是大小端字节序 计算机硬件有两种储存数据的方式:大端字节序(MSB)和 小端字节序(LSB). 小端字节序(LSB) 将这 ...

最新文章

  1. swift 基础学习之属性修饰符
  2. 【转】FireFox与IE js脚本差异 小结
  3. python asyncio future 多线程_深究Python中的asyncio库-线程池
  4. HPUX分析Crash Dump_q4pxdb vmunix
  5. STM32:GPIO的8种输入输出模式深入详解
  6. BytePS源码解析
  7. Windows Phone 7 使用Perst数据库的Demo——流水账
  8. python网易云_使用Python实现下载网易云音乐的高清MV
  9. 领域(学科)知识图谱构建心得
  10. 向量叉积和点积混合运算_向量点积叉积及其几何意义
  11. 国家发展改革委财政部关于不动产登记收费标准等有关问题的通知
  12. python权重是什么意思_Python带权重随机数的简单实现
  13. Android判断手机是否是小米MIUI系统
  14. 【布局优化】基于粒子群求解物流选址matlab源码
  15. INSERT INTO… ON DUPLICATE KEY UPDATE用法
  16. 理解涡流--电磁炉只能加热铁磁性物质(磁化)
  17. tanh () 函数
  18. android 非SDK API blacklist处理
  19. Yocto、Poky、OpenEmbedded 之间的关系
  20. 使用图嵌入方式检测异常日志

热门文章

  1. memset汇编实现,跟踪得到的
  2. k8s核心技术-Pod(概念和存在意义)_Pod多进程设计_Pause根容器---K8S_Google工作笔记0020
  3. Sentinel一键下载安装运行_分布式系统集群限流_线程数隔离_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0030
  4. MyCat分布式数据库集群架构工作笔记0024---高可用_单表存储千万级_海量存储_分表扩展_按照日期分片
  5. STM32工作笔记0069---汉字显示实验
  6. STM32工作笔记0013---认识UCOS系统
  7. Web前端工作笔记003---Javascript 解决IE8不支持filter、map的方法
  8. SpringCloud工作笔记036---oauth2微服务Establishing SSL connection without server's identity verification
  9. 即时通讯学习笔记003---Tigase代码框架解读
  10. Linux学习笔记005----CentOS7 vi模式保存并退出