题外话:如有误,请留言通知我。

大小端,是数值在内存中的排列方式:数值的高低位与内存地址的大小 的关系。

大/小端,英文Big/Little Endian。

注意:endian,就是字节序、字节存储顺序的意思,也有尾数的意思。这里取尾数的含义刚刚好,原因如下。

先说一个前提:内存地址的前xx位通常是系统保留区,用于运行内核程序。所以用户程序就从另一端开始占用 --- 这就是为什么用户程序是从高位地址开始往低位地址伸展。(另一种可能本文不考虑)

在上面的前提下,我们已知int类型的长度是4 bytes,就是说它需要占用4 bytes的内存空间。

那么,它是如何占用的呢?

以 int i = 0x12345678; (见附注)为例说明,可以有两种方式,一种就是12 34 56 78,地址依次减小;另一种则是78 56 34 12,与前面的刚好相反。

两种方式都可以理解。但是,需要记住一点:int的地址永远是低位的(注意前提)。就是说,&i 获取的永远是低位的地址。

那么,第一种方式下,该地址应该是78所在的空间地址;同理,第二中方式下,该地址就是12所在的空间地址!

现在可以继续说尾数(endian)了,0x12345678的尾数自然就是78,该数字所在的端如果是低地址,就是小端对齐,反之,则是大端对齐!

代码验证windows下的大小端对齐方式

  1. #include <stdio.h>
  2.  
  3. //测试大小端对齐
  4. int main(int argc, char const *argv[])
  5. {
  6. int a=0x12345678;
  7. printf("%p, %x\n", &a, a);
  8. char *p=(char *)&a;
  9. char *p2=p;
  10. char *p3=p;
  11.  
  12. //输出大小端
  13. for (int i = ; i < sizeof a; ++i)
  14. {
  15. printf("%p, %x\n", p++, *p);
  16. }
  17.  
  18. //如何反转大小端?
  19. for (int i = ; i < sizeof(a)/; ++i)
  20. {
  21. char tmp=*p2;
  22. *p2 = *(p2+sizeof(a)--*i);
  23. *(p2+sizeof(a)--*i)=tmp;
  24. ++p2;
  25. }
  26. printf("after transfer : %p, %x\n", &a, a);
  27.  
  28. for (int i = ; i < sizeof(a)/; ++i)
  29. {
  30. (*p3) ^= (*(p3+sizeof(a)--*i));
  31. (*(p3+sizeof(a)--*i)) ^= (*p3);
  32. (*p3) ^= (*(p3+sizeof(a)--*i));
  33. ++p3;
  34. }
  35. printf("after transfer again : %p, %x\n", &a, a);
  36.  
  37. return ;
  38. }

附注:

可能有的人不理解为什么要用这个数,或者说,为什么这个数可以说明问题。

这是基础的东西:

  1. int bytes byte bits bits 刚好是一个16进制数字。
  2.  
  3. int == bytes;
  4. byte == bits;
  5. 0x0 ~ 0xF == bits; // ( 0000 ~ 1111 )
  6. byte == 0x00 ~ 0xFF; //( 00000000 ~ 11111111 )
  7. int == 0x00 ~ 0xFF FF FF FF;

所以 1 byte 就是 2 个16进制数字,所以 int 就是 8 个16进制数字!

而为了区别每个byte的内容,将其设为不同的值是最佳选择!

C 学习之大小端的更多相关文章

  1. ARM CPU大小端

    ARM CPU大小端: 大端模式:低位字节存在高地址上,高位字节存在低地址上 小端模式:高位字节存在高地址上,低位字节存在低地址上 STM32属于小端模式,简单的说,比如u32 temp=0X1234 ...

  2. C语言共用体、大小端、枚举

    1.共用体和结构体的相同和不同 (1)相同点就是操作语法几乎相同.(2)不同点是本质上的不同.struct是多个独立元素(内存空间)打包在一起:union是一个元素(内存空间)的多种不同解析方式. # ...

  3. UWP学习记录1-开端

    UWP学习记录1-开端 1.背景 针对不同基础的人,学习的路线自然是不同的.这篇文章记录的是我个人的学习路线,或者说笔记.我对自己的技术状态的定义是: A.有很好的windows平台编程基础: B.有 ...

  4. 联合体union和大小端(big-endian、little-endian)

    1.联合体union的基本特性——和struct的同与不同 union,中文名“联合体.共用体”,在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以 ...

  5. CPU的大小端模式

    不同体系结构的CPU,数据在内存中存放的排列顺序是不一样的. 存储器中对数据的存储是以字节(Byte)为基本单位的,因此,字(Word)和半字(Half-Word)在存储器中就有两种次序,分别称为:大 ...

  6. C++/java之间的Socket通信大小端注意事项

    在一个物联往项目中,需要java云平台与一个客户端做socket定制协议的通信:然而在第一次测试时,并没有按照预想的那样完成解析.查找资料以后是因为客户端的数据读取方式为小端模式,而java默认采用大 ...

  7. 从inet_pton()看大小端字节序

    #include<stdio.h> #include<netinet/in.h> #include<stdlib.h> #include<string.h&g ...

  8. 【转】 CPU大小端

    大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中:小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中. 为什么会有大小端模式之分呢?这是因为 ...

  9. linux kernel 如何处理大小端

    暂时在用MPC8309,不太清楚大小端内核是什么时候给转的. 今天看了关于readl和writel具体实现的文章 今天就主要来分析下readl/writel如何实现高效的数据swap和寄存器读写.我们 ...

随机推荐

  1. Hspice仿真打印某个子模块中所有信号信息

    简单的说就是在你要打印的子模块中加一句:.probe v(*) i(*)就可以了,这个子模块的每一个实例都会被打印出来.

  2. CSS选择器的优化

    前面花了几个篇幅着重介绍了CSS的选择器的使用,我将其分成三个部分:CSS基本选择器.CSS属性选择器以及CSS伪类选择器.那么今天我主要想和大家一起来学习——CSS选择器方面的性能优化.因为对性能这 ...

  3. 分享六:php脚本守护进程

    http://www.baidufe.com/item/9565cec0004cb49d25fd.html

  4. JS正则表达式获取分组内容实例

    JS正则表达式获取分组内容. 支持多次匹配的方式: var testStr = "now test001 test002"; var re = /test(\d+)/ig; var ...

  5. 【Android】17.3 Activity与StartedService的绑定

    分类:C#.Android.VS2015: 创建日期:2016-03-03 一.简介 除了上一节介绍的基本绑定以外,你还可以创建一个同时支持started和bound的服务.也就是说,服务可以通过调用 ...

  6. Vert.x中EventBus中的使用

    注意:使用的是vert.x3.0 仅支持到java8当中有一些lambda表达式.如不明确请自补java8新特性. The Event Bus event bus 是vert.x的神经系统. 每个ve ...

  7. [转]如何使用Fiddler抓取指定浏览器的数据包

    参考资料:https://www.cnblogs.com/lauren1003/p/6519630.html 使用fiddler抓取不到浏览器的包时常用的解决办法: 1.必须先打开Fiddler,再打 ...

  8. mongoose中给字段添加索引的方法

    mongoose中给字段添加索引的方法有两种,一种通过在定义schema的时候配置,如: var animalSchema = new Schema({ name: String, type: Str ...

  9. lua内存管理

    本文内容基于版本:Lua 5.3.0 Lua内存管理器规则 Lua允许用户自定义内存管理器,并在创建Lua虚拟机(lua_State实例)时传入.当然自定义内存管理器必须遵循Lua已定义的一些行为规则 ...

  10. nginx学习之epoll

    https://blog.csdn.net/mmshixing/article/details/51848673 首先说一下传统的I/O多路复用select和poll,对比一下和epoll之间的区别: ...