C语言判断大小端

大小端介绍

中央处理器(CPU:CentralProcessingUnit)和微处理器(MCU:MicrocontrollerUnit)中的存储单元都有存储单元,用来存放程序代码中申请的变量(存在栈区),CPU/MCU的最小存储单元是一1个字节(1Byte)即8bit。
C语言中有多种变量类型如:char(8bit)、short(16bit)、int(32bit)、long long(64bit),其中char类型刚好是一个最小存储单元的大小,那么char型变量就用一个存储单元来存放;但是short、int等变量都比最小存储单元大,这个时候想要存储short、int就只能用几个存储单元来存放。
在存储器中,存储单元的地址是相连的,用几个存储单元来存放变量,就要考虑存放方式。而大小端就是一种数据在存储空间中的存放方式,下面介绍大小端模式,以int a = 0x12345678(16进制数)作为参考数据,0x00,0x01,0x02,0x03为参考地址。

上面的变量a中,跟十进制中个十百千万一样,1是最高位,8是最低位。
上面的地址中0x00是最低地址,0x03是最高地址。
有了这两个概念,大小端就很好明白了。

1、大端模式:**低地址**存**高字节**
地址:0x00 	0x01 	0x02 	0x03
数据:0x12		0x34	0x56	0x78
2、小端模式:**低地址**存**低字节**
地址:0x00		0x01	0x02	0x03
数据:0x78		0x56	0x34	0x12

注意仔细观察上面两者的区别!!!

怎么判断大小端

有了大小端的概念,现在就来解决提出的问题:数据在存储器中的存储方式是大端还是小端?怎么判断?首先肯定是百度咯,如果是CPU(电脑芯片),那百度搜一下芯片手册看一下的数据存储模式;如果是MCU,厂家会给芯片手册,翻一下手册就行,没有手册的,可以去芯片公司官网看看有没有相关资料。如果这个方法行不通,那就软件来解决,使用C语言很简单的几行代码就可以判断出来。

C语言判断大小端方法1

int型变量是32bit,而char*指针每次只会从指向的地址上访问char类型大小(8bit)的空间,利用这个原理,就可以用下面的代码来测试了:

#include <stdio.h>

int main(void)
{
	int a = 0x12345678;
	int *pa = &a;
	char *p = (char*)(&a);
	cahr b = *pa;
	
	printf("%x",*p);//如果结果是12就是大端,否则就是小端
	//printf("%s",((*p)==0x12)?("大端"):("小端"));
	//printf("%s",((char)a == 0x12)?"大端":"小端");
	//printf("%s",(b == 0x12)?"大端":"小端");
	/*上面四个printf都可以测试*/
	
	return 0;
}

这里a尽量用16进制数,换成10进制不能直观看出来,具体为什么,把12345678和0x12345678都换成二进制比较一下就知道什么原因了。

C语言判断大小端方法2

利用联合数据类型来判断,定义的联合体可以兼容很多种类型的数据,利用这个特点可以定义一个包含int和char类型的联合体来测试:

#include<stdio.h>

union UNION{
	int a;
	char b;
}union_test;

int main(void)
{
	union_test.a=0x12345678;
	printf("%s\n",(union_test.b == 0x78)?"小端":"大端");
	
	return 0;
}

我们给int成员赋值,但是与此同时其他成员b也是可以使用的,但是b的值是从联合体的起始地址往后1个字节上的内容(因为b是char类型),a的值是从联合体的起始地址往后4个字节上的内容(因为a是int类型),如果处理器是大端存储,那么第一个字节就会存放高位(0x12),如果是小端存储,那么第一个字节就存放低位(0x78)。

热门文章

暂无图片
编程学习 ·

C++数据结构第16课、线性表存储结构的抽象实现

课程目标 — 完成顺序存储结构线性表的抽象实现SeqList 设计要点 — 抽象类模板,存储空间的位置和大小由子类完成 — 实现顺序存储结构线性表的关键操作(增、删、查、等) — 提供数组操作符,方便快速获取元素SeqList.h #ifndef SEQLIST_H #define SEQLIST_H#include "…
暂无图片
编程学习 ·

js 的递归写法 代码的健壮性

这几天参加面试,有个关于递归的问题,之前学红皮书的手后,看过也写过代码,但是时间长了不用就会忘记,翻书肯定没有自己记住效率高;首先解释一下为什么这么写;//因为函数的本质是一个对象,fun是声明在栈内存中,其中保存一个地址,系统通过地址可以在堆中找到一个Function的对象;fu…
暂无图片
编程学习 ·

javaScript之ES6

ES6新增的内容 新增的let和constlet num1 = 10console.log(num1) //10const num2 = 10console.log(num2) //10let const声明变量和 var声明变量的区别:用let 和const 声明的变量不会进行预解析,只能先声明后使用 用let 和const 不能重复声明同一个变量 用let 和const声明 变…
暂无图片
编程学习 ·

BIO、NIO、AIO基本概念

BIO 采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理,处理完成后,通过输出流返回应答给客户端,线程销毁。 BIO主要的问题在于每当有一个新的客户端请求接入时,服务端必须…
暂无图片
编程学习 ·

Day 11 武装飞船

《外星人入侵》游戏要实现的是:玩家控制一艘出现在屏幕底部中央的飞船,可以使用箭头左右移动飞船,还可以使用空格来进行射击,游戏开始时候一群外星人出现在天空,他们在屏幕中向下移动,玩家的任务是射杀这些外星人,玩家将所有外星人都消灭干净后,会出现一群新的外星人,…
暂无图片
郑州普通话 ·

学习笔记六——循环神经网络

一、RNN 前馈神经网络&#xff1a;信息往一个方向流动。包括MLP和CNN 循环神经网络&#xff1a;信息循环流动&#xff0c;网络隐含层输出又作为自身输入&#xff0c;包括RNN、LSTM、GAN等。 RNN模型结构如下图所示&#xff1a; 展开之后相当于堆叠多个共享隐含层参数的前馈…
暂无图片
代理记账 ·

学习笔记六——循环神经网络

一、RNN 前馈神经网络&#xff1a;信息往一个方向流动。包括MLP和CNN 循环神经网络&#xff1a;信息循环流动&#xff0c;网络隐含层输出又作为自身输入&#xff0c;包括RNN、LSTM、GAN等。 RNN模型结构如下图所示&#xff1a; 展开之后相当于堆叠多个共享隐含层参数的前馈…
暂无图片
cgfy ·

学习笔记六——循环神经网络

一、RNN 前馈神经网络&#xff1a;信息往一个方向流动。包括MLP和CNN 循环神经网络&#xff1a;信息循环流动&#xff0c;网络隐含层输出又作为自身输入&#xff0c;包括RNN、LSTM、GAN等。 RNN模型结构如下图所示&#xff1a; 展开之后相当于堆叠多个共享隐含层参数的前馈…
暂无图片
coreui ·

Heap Sort 讲解

Heap Sort sorts a group of unordered elements using the Heap data structure. The sorting algorithm using a Min Heap is as follows: Heapify all elements into a Min HeapRecord and delete the top elementPut to top element into an array T that stores all so
暂无图片
未来博客 ·

Heap Sort 讲解

Heap Sort sorts a group of unordered elements using the Heap data structure. The sorting algorithm using a Min Heap is as follows: Heapify all elements into a Min HeapRecord and delete the top elementPut to top element into an array T that stores all so
暂无图片
建站日记 ·

[react] 你觉得react上手快不快?它有哪些限制?

[react] 你觉得react上手快不快&#xff1f;它有哪些限制&#xff1f; 相对vue来说不快。 限制 需要学习JSX需要工程化的配置需要对原生JavaScript有相当的掌握react只是一个UI层面的库&#xff0c;像vue内置了动画处理、keep-alive等功能&#xff0c;react则需要去找第三方库…
暂无图片
mfbz ·

学习笔记六——循环神经网络

一、RNN 前馈神经网络&#xff1a;信息往一个方向流动。包括MLP和CNN 循环神经网络&#xff1a;信息循环流动&#xff0c;网络隐含层输出又作为自身输入&#xff0c;包括RNN、LSTM、GAN等。 RNN模型结构如下图所示&#xff1a; 展开之后相当于堆叠多个共享隐含层参数的前馈…
暂无图片
mfbz ·

AOV网是否存在回路-拓扑排序-C++

拓扑排序是对测试AOV网是否存在回路的方法&#xff01; 拓扑排序的过程中&#xff0c;由于需要查找所有以某顶点为尾的弧&#xff0c;即找到该顶点的所有出边&#xff0c;故图要采用邻接表的存储方式。但拓扑排序较邻接表的存储方式有一点不同&#xff0c;由于要查找入度为0的点…
暂无图片
珊珊日记 ·

学习笔记六——循环神经网络

一、RNN 前馈神经网络&#xff1a;信息往一个方向流动。包括MLP和CNN 循环神经网络&#xff1a;信息循环流动&#xff0c;网络隐含层输出又作为自身输入&#xff0c;包括RNN、LSTM、GAN等。 RNN模型结构如下图所示&#xff1a; 展开之后相当于堆叠多个共享隐含层参数的前馈…
暂无图片
珊珊日记 ·

AOV网是否存在回路-拓扑排序-C++

拓扑排序是对测试AOV网是否存在回路的方法&#xff01; 拓扑排序的过程中&#xff0c;由于需要查找所有以某顶点为尾的弧&#xff0c;即找到该顶点的所有出边&#xff0c;故图要采用邻接表的存储方式。但拓扑排序较邻接表的存储方式有一点不同&#xff0c;由于要查找入度为0的点…