zoukankan      html  css  js  c++  java
  • 用C语言代码判别CPU的大小端模式

       Big-endian和little-endian是描述排列存储在计算机内存里的字节序列的术语。
          Big-endian是一种大值的一端(序列中更典型值)存在前面(在最小的存储地址)的顺序。Little-endian是一种小值的一端(序列中较不典型的值)存储在前的顺序。比如,在Big-endian的电脑中,需要两个字节把十六位数4F52当作4F52存在存储器中(如果4F存在存储地址1000中,比如说,52将存在1001中)。在little-endian系统里,将被存为524F(52存在存储地址1000中,比如说,4F将存在1001中)。

    一个例子:
    如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
               big-endian   little-endian
    0x0000      0x12        0xcd
    0x0001      0x34        0xab
    0x0002      0xab        0x34
    0x0003      0xcd        0x12

    那么,怎么用C语言来实现判别功能呢?

    有两种方法,第一种借用指针和强制转换的方法来实现。

    代码如下:

       1:  define TRUE 1
       2:  #define FALSE 0
       3:  #define BOOL int
       4:   
       5:  BOOL  isBigEndian()
       6:  {
       7:      int  i = 1;   /* i = 0x00000001*/
       8:      char  c = *(char  *)&i; /* 注意不能写成 char c = (char)i; */
       9:      return  (int )c != i;
      10:  }
     

    如果是little endian字节序的话,那个i = 1;的内存从小到大依次放的是:0x01 0x00 0x00 0x00,如是,按照i的起始地址变成按照char *方式(1字节)存取,即得c = 0x01;
    反之亦然

    第二种呢,借用c语言中union这种数据类型。

       1:  BOOL  isBigEndian()
       2:  {
       3:      union
       4:      {
       5:          int  i;
       6:          char  c;
       7:      }test;
       8:      
       9:      test.c = 2;
      10:   
      11:      return  test.i != 2;
      12:  }

    这里用的是union来控制这个共享布局,有个知识点就是union里面的成员c和i都是从低地址开始对齐的。同样可以得到如此结果,而且不用转换,清晰一些。

    参考:http://blog.csdn.net/jiangnanyouzi/article/details/3158702

    以及 http://blog.csdn.net/flickedball/article/details/4096991

  • 相关阅读:
    java编程继承的第一原则
    Java基本语法总结
    java 语言实现的随机数生成算法
    java实现微公众平台自定义菜单
    使用Java调用谷歌搜索
    Java 语言实现的随机数生成算法
    浅谈Java中的instanceof关键字
    Java 编程基础 类和继承总结
    异常封装提高Java代码质量
    CSS-font
  • 原文地址:https://www.cnblogs.com/xubenben/p/3363577.html
Copyright © 2011-2022 走看看