zoukankan      html  css  js  c++  java
  • 大端模式与小端模式

      对于跨越多字节的程序对象,我们必须建立两个规则:这个对象的地址是什么,以及在存储器中如何安排这些字节。在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用字节的最小地址。例如,假设一个型为int变量x的地址为0x100,也就是说,地址表达式&x的值为0x100。那么,x的4个字节被存储在存储器的0x100,0x101,0x102和0x103位置。

      排列表示一个对象的字节有两个通用的规则。考虑一个w位的整数,位表示为[Xw-1,xw-2,...,x1,x0],其中xw-1是最高有效位i,而x0是最低有效位,假设w是8的倍数,这些位就能被分组成字节,其中最高有效字节包含位[xw-1,xw-2,...,xw-8],最低有效字节包含位[x7,x6,...,x0],其他字节包含中间的位。某些机器选择在存储器中按照从最低有效字节到最高有效字节的顺序存储对象,而另一些机器则按照从最高有效字节到最低有效字节的顺序存储。前一种规则——最低有效字节在最前面的方式,称为小端法(little endian)。大多数intel兼容机都采用这种规则。后一种规则——最高有效字节在最前面的方式,称为大端法(big endian)。大多数IBM和Sun Microsystems的机器都采用这种规则。

      继续我们前面的示例,假设变量x类型为int,位于地址0x100处,它的十六进制值为0x1234567.地址范围为0x100~0x103的字节,其排列顺序依赖于机器的类型。

      

      注意,在字0x01234567中,高位字节的十六进制值为0x01,而低位字节值为0x67。

     

    如何判断大端模式和小端模式

    方法一

      

    void CheckEndian() {
        short a = 0x1234;
        char* p = (char*)&a;
        if ((*p) == 0x12){
            printf("Big Endian
    ");
        } else if ((*p) == 0x34) {
            printf("Little Endian
    ");
        }
    
    }

    方法二:

    void CheckEndian() {
        union Num {
            short a;
            char b;
        } num;
        num.a = 0x1234;
        if (num.b == 0x12) {
            printf("Big Endian
    ");
        } else if (num.b == 0x34) {
            printf("little Endian
    ");
        }
    }

    参考资料:

      1. http://blog.csdn.net/ce123_zhouwei/article/details/6971544

  • 相关阅读:
    MySQL 8.0.14版本新功能详解
    Uncaught TypeError: Right-hand side of 'instanceof' is not an object
    程序员快速技术提升之道
    Windows 10 cmd命令符的使用
    数据千万条,备份第一条:VFEmail被擦除所有数据面临关停
    netty-socketio 示例代码
    idea中 在接口中如何直接跳转到该接口的是实现类中?
    perl DBD处理超时问题
    springboot 启动配置文件配置
    Office Word 发布文章到博客园
  • 原文地址:https://www.cnblogs.com/vincently/p/4819956.html
Copyright © 2011-2022 走看看