判断系统大小端字节序的方法

news/2024/11/15 9:42:07/文章来源:https://www.cnblogs.com/BaiHehuai/p/18430030

1、字节序
1.1、大端字节序(big-endian)
数据低位存储在高地址位,数据高位存储在低地址位。
假设定义一个变量并赋予初值:
int a = 0x12345678;
对于这个整型数据,一共有四个字节,假设为其分配的地址空间为0x1001~0x1004,则从低位到高位,每个字节依次是:12、34、56、78。数据将会以下面的形式储存在内存中:

1.2、小端字节序(little-endian)
数据低位存储在低地址位,数据高位存储在高地址位。
假设定义一个变量并赋予初值:
int a = 0x12345678;
对于这个整型数据,一共有四个字节,假设为其分配的地址空间为0x1001~0x1004,则从低位到高位,每个字节依次是:78、56、34、12。数据将会以下面的形式储存在内存中:

2、验证大端字节序还是小端字节序
2.1、通过联合体union判断
联合体是一个能在同一存储空间存储不同类型的数据类型。简单来讲,这段地址空间是联合体中各成员变量共用的,具体用到多少空间取决于各成员变量自身的大小。但是,一个联合体的大小取决于联合体成员中最大的变量的大小。
定义一个联合体:

union u_data  
{  
unsigned char a;  
unsigned int b;  
} data;

在这个联合体中,共用的是低地址位的一个字节,如果需要获取b的值,那么就需要根据系统其对应的大小端字节序来取4个字节的值,而获取a的值,系统只会从该段地址中的低地址取1个字节的值。
所以,通过给b赋值,然后再获取a的值,即可根据结果判断系统是大端字节序还是小端字节序。
根据上面的图示,如果构建联合体u_data,并将b赋初值0x12345678,如果读取a的值为0x78,则代表系统是小端字节序,如果读取a的值为0x12,则代表系统是大端字节序。
代码验证:

#include <stdio.h>    int main()    
{    union u_data    {    unsigned char a;    unsigned int b;    } data;    data.b = 0x12345678;    if (data.a = 0x78)    {    printf("小端字节序\n");    }    else if (data.a == 0x12)    {    printf("大端字节序\n");    }    return 0;    
}

2.2、通过指针判断
先用代码实现,然后再分析实现原理:

#include <stdio.h>    int main()    
{    int a = 0x12345678;  char *p = NULL;  p = (char *)&a;  if (*p == 0x78)  {  printf("小端字节序\n");  }  else if (*p == 0x12)  {  printf("大端字节序\n");  }    return 0;    
}

代码中定义了一个整型变量a,char型指针变量p。指针会指向整型数的首地址,当调用p往地址里取值时,系统会根据指针的类型大小去对应大小的值。
例如,程序中char型的指针就会从它指向的地址往后取char类型(1个字节)的值,故首先会取其低地址位的1个字节的内容。如果p=0x78,可以判断系统是小端字节序;如果p=0x12,可以判断系统是大端字节序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/803053.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第二十四讲:MySQL是怎么保证高可用的?

为了让各位更好的了解文章,我归纳了下面几点最重要的: 1、MySQL 高可用系统的可用性,是依赖于主备延迟的。延迟的时间越小,主库故障的时候,服务恢复需要的时间就越短,可用性就越高。 2、主备延迟原因:备库用的机子不行(IOPS是和主库相同的,不要轻视备库)、备库压力太…

redis内容记录

redis的基本数据类型String:是最基本的数据类型,它可以存储任何二进制安全的数据。 不仅能存放文本数据,还能保存图片、音频、视频、压缩文件等二进制数据。它们通常用于缓存。 Hash:哈希类型,其中键值对中的值本身又是一个键值对结构,hash 特别适合用于存储对象。 List:…

人工智能教育技术学第四周

1.用亿图图示制作黄山奇石语文课文的思维导图2.CAJViewer9.2(CAJ全文浏览器)是中国知网的专用全文格式阅读器,CAJ浏览器支持中国期刊网的CAJ、PDF、KDH等多种格式文件阅读。并且它的打印效果与原版的效果一致。可实现页面设置、浏览页面、查找文字、切换显示语言、文本摘录、…

项目实战:Qt+OSG爆破动力学仿真三维引擎测试工具v1.1.0(加载.K模型,子弹轨迹模拟动画,支持windows、linux、国产麒麟系统)

需求1.使用osg三维引擎进行动力学模型仿真性能测试;  2.打开动力学仿真模型文件,.k后缀的模型文件,测试加载解析过程;  3.解决第三方company的opengl制作的三维引擎,绘制面较多与弹丸路径模拟较卡顿的问题;  4.测试时,使用的模型为公开模型,基础面数量达到160多万…

【入门岛第1关】linux 基础知识

目录闯关任务 完成SSH连接与端口映射并运行hello_world.py 闯关任务 完成SSH连接与端口映射并运行hello_world.py 1 在远程主机上建立hello_python.py程序并运行,查看程序运行的端口: import socket import re import gradio as gr# 获取主机名 def get_hostname():hostname …

DOTS计算Voronoi图形生成,根据点自动划分区域生成多边形

如图,生成Voronoi图形,代码如下。// web* src = https://gist.github.com/andrew-raphael-lukasik/cc9d61edbbb44ecb4956c6cb69363a8e using UnityEngine; using Unity.Mathematics; using Unity.Jobs; using Unity.Collections; using Unity.Profiling;[ExecuteInEditMode] …

Vue2+3基础

。第一个Vue程序 使用script进行Vue全局设置: 指定Vue实例挂载的位置 , Vue和js一样,都需要在script里写 第一步创建vue实例 1.为什么要new vue(),直接调用Vue不行吗?不行,因为如果直接调用Vue()会报如下错误: 2.关于vue构造函数:optionsoptions翻译为多个选项 Vue…

JAVA的字符串这篇讲清楚了

JAVA_String 从概念上讲,JAVA字符串就是Unicode序列。例如"Java\u2122"由5个UNICODE字符J,a,v,a和™组成。Java没有内置和字符串类型,而是试用java标准库中提供的一个预定义类,很自然地叫做了string。 子串substring String subStr = str.substring(beginIndex);这…

任务4:制作二维码

该二维码链接到游戏“植物大战僵尸”,寓教于乐。 提升趣味性和互动性的同时,学生们参与到课堂当中,发挥主体作用,感受到自然界植物的多样性,对土壤的作用有了更深刻的理解。

封装的练习题目1

1.使用面向对象的思想,编写自定义描述狗的信息。设定属性包括:品种,年龄,心 情,名字;方法包括:叫,跑。 要求: 1)设置属性的私有访问权限,通过公有的 get,set 方法实现对属性的访问 2)限定心情只能有“心情好”和“心情不好”两种情况,如果无效输入进行提示, 默认…

五款免费可视化工具全解析:选择你的最佳搭档

1. 山海鲸可视化 介绍: 山海鲸可视化是一款免费的国产可视化报表软件,与许多其他宣传免费的软件不同,山海鲸的报表功能完全免费并且没有任何限制,就连网站管理后台这个功能也是免费的。同时山海鲸可视化还提供了种类丰富的可视化图表、三维模型、模板可供使用,软件采用点击…