大端存储模式是指字或半字的最高字节(Most Significant Bit,MSB)存放在内存的最低位字节地址上,而字数据的低字节则存放在高地址中。打个比方,有一个字为0x12345678,这个字由4个字节组成,从高位到低位的次序为:0x12,0x34,0x56,0x78。如果把这个字存放在以0x00000000起始的内存中,这个字在内存中的实际存放情况如下表:
内存地址 |
存储的数据(Byte) |
0x00000000 |
0x12 |
0x00000001 |
0x34 |
0x00000002 |
0x56 |
0x00000003 |
0x78 |
0x00000004 |
…… |
大端模式的次序就像是我们平时书写的次序,先写大数,后写小数。另外,大端存储次序还广泛运用在TCP/IP协议上,因此又称为网络字节次序。
小端存储模式是指字或半字的最低位字节(Lowest Significant Bit,LSB)存放在内存的最低位字节地址上,而字数据的高字节则存放在高地址中。还以0x12345678为例,在小端模式下存储如下表所示:
内存地址 |
存储的数据(Byte) |
0x00000000 |
0x78 |
0x00000001 |
0x56 |
0x00000002 |
0x34 |
0x00000003 |
0x12 |
0x00000004 |
…… |
需要注意的几点是:
(1) 数据在寄存器中都是以大端模式次序存放的。
(2) 对于内存中以小端模式存放的数据。CPU存取数成时,小端和大端之间的转换是通过硬件实现的,没有数据加载/存储的开销。
例题1:
int main()
{
long long a=1;
long long b=2;
long long c=3;
printf("%d,%d,%d",a,b,c);
return 0;
}
输出结果是什么?(32位环境,cpu为小端模式,所有参数用栈传递)
解答:
在32和64上面, long long都是8字节,小端模式是将数据的低位字节存放在内存的低位地址上。printf("%d %d %d\n", a, b, c)依次将c , b, a三个long long型的数据压入栈中,然后以d%的格式输出,会依次从a的地址开始输出3个整型数据(4B)一共是12B,调用printf时参数从右至左压栈,压栈顺序是c,b,a且地址是连续存放的,小端情况下从a开始的栈去内存内容如下:
0x 01 00 00 00 00 00 00 00
0x 02 00 00 00 00 00 00 00
0x 03 00 00 00 00 00 00 00
所以连续输出12个字节的结果就是:1 0 2
知道了大小端模式的概念,但如果让我们用C语言写段代码判断一个CPU是大端模式还是小端模式应当如何做呢 ?
要用C语言简洁的实现就要用到联合体(union),简单的说union就是一种结构,在union中所有的数据成员共用一个存储空间,在同一时间只能存储其中的一个数据成员,所有的数据成员具相同的起始地址,相对于基地址的偏移量都为0;
采用union来判断,具体代码如下:
- int CheckEndian(void)
- {
- union check
- {
- int Word;
- char Half;
- } Endian;
- Endian.Word=1;
- if(1 == Endian.Half)
- return Little_Endian;
- else
- return Big_Endian;
- }
CPU的大小端模式的更多相关文章
-
判断机器CPU的大小端模式并将数据转换成小端形式
首先看一下概念 Little-Endian 就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端 Big-Endian 就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端. 第一 ...
-
用C语言代码判别CPU的大小端模式
Big-endian和little-endian是描述排列存储在计算机内存里的字节序列的术语. Big-endian是一种大值的一端(序列中更典型值)存在前面(在最小的存储地址)的顺序. ...
-
CPU大小端模式及转换
通信协议中的数据传输.数组的存储方式.数据的强制转换等这些都会牵涉到大小端问题. CPU的大端和小端模式很多地方都会用到,但还是有许多朋友不知道,今天暂且普及一下. 一.为什么会有大小端模式之分呢? ...
-
清晰讲解LSB、MSB和大小端模式及网络字节序
时隔一个月又回到了博客园写文章,很开心O(∩_∩)O~~ 今天在做需求的涉及到一个固件版本的概念,其中固件组的人谈到了版本号从MSB到LSB排列,检索查阅后将所得整理如下. MSB.LSB? MSB( ...
-
C/C++ 关于大小端模式
大端模式: 数据的高字节存在低地址 数据的低字节存在高地址 小端模式: 数据的高字节存在高地址 数据的低字节存在低地址 如图,i为int类型占4个字节,但只有1个字节的值为1,另外3个字节值为 ...
-
union关键字 与大小端模式
union 关键字(主要用来压缩空间,如果一些数据不可能同一时间同时用到,可是考虑使用union) union关键字声明的变量称之为联合体变量: (1)联合体变量只配置一个足够大的空间来容纳最大长度的 ...
-
C语言怎么简单测试为大小端模式
作者:Slience_J 原文地址:https://blog.csdn.net/slience_j/article/details/52048267 1.什么是大小端模式? 大端模式,是指数据的高字节 ...
-
mips32和x86下的大小端模式判定
一.背景 1.1 mips32搭载32bit vxworks操作系统 1.2 x86搭载64bit windows10操作系统 二.大小端模式判定前的准备 2.1 先要知道各种架构上各种整型数占据的b ...
-
经典笔试题:用C写一个函数测试当前机器大小端模式
“用C语言写一个函数测试当前机器的大小端模式”是一个经典的笔试题,如下使用两种方式进行解答: 1. 用union来测试机器的大小端 #include <stdio.h> union tes ...
随机推荐
-
AngularJS:自定义过滤器
表达式: {{ expression | filter1 | filter2 | ... }} {{ expression | filterName : paramet ...
-
Sage CRM 平衡区域树结构
Sage CRM 的区域是把整数区间-214748364 ~02147483647划分为一个个相等的区间,使用数字的范围来表示区域的概念. 默认情况下,crm把区域划分为10
-
日期加减js,天数组增加,日期自动修改
最近在弄火车票的项目,因为火车票选日期最大范围是20天,所要要控制在当前时间的20天内的一个日期 开始在网上找了一个直接修改Date prototype 后来领导说这样不太好,所以只能换个别的方法写 ...
-
HDU2255 奔小康赚大钱【二分图最佳匹配】
题目链接: http://acm.hdu.edu.cn/showproblem.php? pid=2255 题目大意: 村里要分房子. 有N家老百姓,刚好有N间房子.考虑到每家都要有房住,每家必须分配 ...
-
BestCoder Round #61 (div.2)
Numbers Accepts: 571 Submissions: 1212 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/26 ...
-
设计模式之 - 外观模式 (Facade design pattern)
1. 模式意图: 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更容易使用. 2. 结构 3. 工厂方法模式C#实现 using System; ...
-
2017 Android 面试题 [ 基础与细节 ]
2017 Android 面试题 [ 基础与细节 ] 感谢@chuyao抛出的这些问题,平时业务代码写多了,很多基础的东西变得含糊不清了,这次裸辞出来找工作确实没有之前顺利,顺便求上海Android开 ...
-
UWP 手绘视频创作工具 “来画Pro” 技术分享系列
开篇先来说一下我和来画的故事,以及写这篇文章的初衷. 今年年初时,我还在北京,在 Face++,做着人脸识别技术的 Windows 和 Android 端,做着人工智能终将实现世间所有美好的梦.这时的 ...
-
linear-grident的属性和使用
css3新增Gradient属性,用来增加渐变的效果,渐变分为线性渐变 linear-grident 和 径向渐变 radial-grident,这篇文章主要介绍线性渐变linear-grident ...
-
接口自动化:HttpClient + TestNG + Java(二) - 第一个接口测试:get请求
在上一篇中,我们搭建好了HttpClient + TestNG + Java的自动化接口测试环境,这一篇我们就赶紧开始编写我们的第一个接口测试用例. 本篇会对问题解决的思路进行更详尽的阐述. 2.1 ...