zoukankan      html  css  js  c++  java
  • 如何判断机器是大端机还是小端机

    大端和小端的定义

    大端:数据的高位字节存放在低地址内,数据的低位字节存放在高地址内。

    小端:数据的高位字节存放在高地址内,数据的低位字节存放在低地址内。

    热知识

    机器读取内存数据时,是从低位地址到高位地址进行读取

    一般来说,栈分配的方向是从高地址向低地址分配,但在变量内部地址是从低地址向高地址增长(变量的起始地址为低地址)。

    例:一个整型是4个字节,如:0x1a2b3c4d(16进制)。

    在小端机器中从低地址到高地址的存放方式为:0x4d,0x3c,0x2b,0x1a;(低地址存低位)

    在大端机器中从低地址到高地址的存放方式为:0x1a,0x2b,0x3c,0x4d;(低地址存高位)

    方法一:将字符数据赋给整型数据,通过读取整型数据的值来判别大端还是小端

     代码实现(C++)

    #include <iostream>
    using namespace std;
    int main() {
        unsigned int data = 0;
        unsigned int *point = &data;
        *(char*)point = 0x22;
        if(data == 0x22)
            cout << "这是一个小端机" << endl;
        else if(data == 0x22000000)
            cout << "这是一个大端机" << endl;
        else
            cout << "无法判定该机器类型" << endl;
        return 0;
    }

    方法二:通过联合体union的共享内存特性,来判断大端机、小端机

    union联合体的所有变量公用一块内存,在内存中的存储是按最长的那个变量所需要的位数来开辟内存的。

    它有一个特性:其存放顺序是所有成员都从低地址开始存放

    代码实现(C++)

    #include <iostream>
    using namespace std;
     
    union UN{
        char ch;
        int data;
    };
     
    int main() {
        union UN un;
        un.data = 0x1a2b3c4d;
        if(un.ch == 0x4d)
            cout << "这是一个小端机" << endl;
        else if(un.ch == 0x1a)
            cout << "这是一个大端机" << endl;
        else
            cout << "无法判定该机器" << endl;
        return 0;
    }

    方法三:通过指针来判断

    将一个整型数据赋给字符型数据,通过查看字符型数据的值来判定是大端机还是小端机。将整型赋给字符型,会发生数据的丢失。如果是大端机,则会丢失低字节;如果是小端机,则会丢失高字节。和第一种方法很类似,一个是查看整型的值,一个是查看字符型的值。

    代码实现(C++)

    int main() {
        int data = 1;
        char* p = (char*)&data;
        if(*p == 1)
            cout << "这是一个小端机" << endl;
        else if(*p == 0)
            cout << "这是一个大端机" << endl;
        return 0;
    }

    参考资料

    https://blog.csdn.net/qiana_/article/details/81239869

    https://www.cnblogs.com/rosesmall/archive/2012/03/27/2419527.html

    Min是清明的茗
  • 相关阅读:
    什么是OOAD?什么是UML?
    Linux下Gvim 的基本操作-适合新手看
    关于mongodb ,redis,memcache之间见不乱理还乱的关系和作用
    phpcms常用标签
    请问如何更改dedecms“文件保存目录”的字符限制 ?
    如何通过刷百度指数来提高网站的权重
    HDU 1263(水果统计 **)
    HDU 1284(钱币兑换 背包/母函数)
    HDU 1028(数字拆分 分治)
    HDU 1036(平均速度 **)
  • 原文地址:https://www.cnblogs.com/MinPage/p/14044851.html
Copyright © 2011-2022 走看看