一.背景

1.1 mips32搭载32bit vxworks操作系统

1.2 x86搭载64bit windows10操作系统

二.大小端模式判定前的准备

2.1 先要知道各种架构上各种整型数占据的bit数,也就是通过范围来确定bit数

上一篇已经讲过,特奉上地址如下:

http://www.cnblogs.com/dakewei/p/7690847.html

2.2 mips32上的判定

代码如下:

#include <stdio.h>

void main(void)

{

  unsigned long int ul = 1;

  unsigned char *p = &ul;

  p += (sizeof(unsigned long) - 1); /*因为mips32上unsigned long 类型占据了32个bit,因此移动3个字节,以便到达最后一个字节*/

  printf("*p = %d,p = %p,ul = %d,&ul = %p\n",*p,p,ul,&ul);

}

运行结果如下:

*p = 1,p = 0x80cf3fcb,ul = 1,&ul = 0x80cf3fc8

对运行结果进行分析如下:

先回忆大小端的定义:

大端模式: 低位数据存储在高地址

小端模式:低位数据存储在低地址

那么内存中数据的存放情况如下:

-------------------

0x80cf3fc8  |    0x00         |

     --------------------

0x80cf3fc9  |    0x00         |

        --------------------

0x80cf3fca |      0x00        |

--------------------

0x80cf3fcb |     0x01         |

--------------------

由此可以判定:笔者的mips32机器是大端机器(笔者的这台mips32机器是可以设置大小端的)

2.3 x86上的判定

代码如下:

#include <stdio.h>

void main(void)

{

  unsigned long int ul = 1;

  unsigned char *p = &ul;

  p += (sizeof(unsigned long) - 1); /*因为x86上unsigned long 类型占据了64个bit,因此移动7个字节,以便到达最后一个字节*/

  printf("*p = %d,p = %p,ul = %d,&ul = %p\n",*p,p,ul,&ul);

}

运行结果如下:

*p = 0,p = 0xffffcc07,ul = 1,&ul = 0xffffcc00

对运行结果进行分析如下:

先回忆大小端的定义:

大端模式: 低位数据存储在高地址

小端模式:低位数据存储在低地址

那么内存中数据的存放情况如下:

-------------------

0xffffcc00  |    0x01         |

     --------------------

0xffffcc01 |    0x00         |

        --------------------

0xffffcc02 |      0x00        |

--------------------

0xffffcc03 |     0x00        |

--------------------

0xffffcc04  |    0x00         |

     --------------------

0xffffcc05 |    0x00         |

        --------------------

0xffffcc06 |      0x00        |

--------------------

0xffffcc07 |     0x00         |

--------------------

由此可以判定:笔者的x86机器是小端机器

mips32和x86下的大小端模式判定的更多相关文章

  1. CPU的大小端模式

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

  2. 清晰讲解LSB、MSB和大小端模式及网络字节序

    时隔一个月又回到了博客园写文章,很开心O(∩_∩)O~~ 今天在做需求的涉及到一个固件版本的概念,其中固件组的人谈到了版本号从MSB到LSB排列,检索查阅后将所得整理如下. MSB.LSB? MSB( ...

  3. CPU大小端模式及转换

    通信协议中的数据传输.数组的存储方式.数据的强制转换等这些都会牵涉到大小端问题. CPU的大端和小端模式很多地方都会用到,但还是有许多朋友不知道,今天暂且普及一下. 一.为什么会有大小端模式之分呢? ...

  4. C/C++ 关于大小端模式

    大端模式:  数据的高字节存在低地址  数据的低字节存在高地址 小端模式:  数据的高字节存在高地址  数据的低字节存在低地址 如图,i为int类型占4个字节,但只有1个字节的值为1,另外3个字节值为 ...

  5. union关键字 与大小端模式

    union 关键字(主要用来压缩空间,如果一些数据不可能同一时间同时用到,可是考虑使用union) union关键字声明的变量称之为联合体变量: (1)联合体变量只配置一个足够大的空间来容纳最大长度的 ...

  6. C语言怎么简单测试为大小端模式

    作者:Slience_J 原文地址:https://blog.csdn.net/slience_j/article/details/52048267 1.什么是大小端模式? 大端模式,是指数据的高字节 ...

  7. 经典笔试题:用C写一个函数测试当前机器大小端模式

    “用C语言写一个函数测试当前机器的大小端模式”是一个经典的笔试题,如下使用两种方式进行解答: 1. 用union来测试机器的大小端 #include <stdio.h> union tes ...

  8. [Linux] Big-endian and Little-endian (大小端模式)

    Big-endian Little-endian 大小端模式   https://en.wikipedia.org/wiki/Endianness 大端模式,是指数据的高字节保存在内存的低地址中,而数 ...

  9. Linux大小端模式转换函数

    转自 http://www.cnblogs.com/kungfupanda/archive/2013/04/24/3040785.html 不同机器内部对变量的字节存储顺序不同,有的采用大端模式(bi ...

随机推荐

  1. Django ORM之QuerySet

    Django ORM用到三个类:Manager.QuerySet.Model.Manager定义表级方法(表级方法就是影响一条或多条记录的方法),我们可以以models.Manager为父类,定义自己 ...

  2. 高并发秒杀系统方案(集成Mybatis和Redis)

    1.集成Mybatis 第一步,添加依赖: <dependency> <groupId>org.mybatis.spring.boot</groupId> < ...

  3. 智能指针 - 现代C++新特性总结

    C++98中的智能指针通过一个模板类auto_ptr来实现,new操作符返回的指针可以交由它来管理,程序员不用再显式的调用delete,这在一定程度上避免了堆内存忘记释放的问题:不过auto_ptr有 ...

  4. 登录mysql出现/var/lib/mysql/mysql.sock不存在

    问题描述: 1.mysql安装完成后,使用 service mysqld start 总是出现 start failed. 2.使用mysql -uroot -p登录出现找不到 /var/lib/my ...

  5. MUTABLE和IMMUTABLE集合

    Scala 集合类系统地区分了可变的和不可变的集合.可变集合可以在适当的地方被更新或扩展.这意味着你可以修改,添加,移除一个集合的元素.而不可变集合类,相比之下,永远不会改变.不过,你仍然可以模拟添加 ...

  6. [py]python面向对象的str getattr特殊方法

    本文旨在说清楚 类中的 def init def str def getattr 这三个方法怎么用的. 定制输入实例名时输出内容 def __str__会定制输出实例名时候的输出 class Chai ...

  7. 混淆和加密.NET开发工具

    .NET开发的工具,可以用ILSpy等很轻松的反编译查看源码,为了保护自己写的软件,一般会对软件进行加密,不仅内部关键数据通过加密,软件开发完毕后,对软件也进行加密,防止别人很轻松的反编译和查看到比较 ...

  8. MongoDB 工具助手类(.NET)

    在开发过程中,需要用到MongoDB,本身MongoDB自己对类的封装就特别好了.为了更加符合我们平时的开发使用,我现在进行了一个简单的封装操作. 连接数据库类:MongoDBContext usin ...

  9. js判断两个日期是否严格相差整年(合同日期常用)

    1.var beginDate = new Date($("#InvoiceStartTime").val()); var endDate = new Date($("# ...

  10. shell篇(一)

    login shell与non-login shell: login shell:取得shell时,需要完整的登入流程.如:tty1~tty6登入时,需要输入用户名和密码.此时取得的shell就称为l ...