如何判断CPU是大端还是小端模式

合集下载

判断所使用机器大小端的方法

判断所使用机器大小端的方法

判断所使用机器大小端的方法
机器大小端是指数据在内存中存储的顺序,分为大端和小端两种。

判断所使用机器大小端的方法如下:
1.取一个数的地址,然后将其强制转换为指向char类型的指针,再取出该指针指向的数据。

如果该数据的值为0x01,则为小端机器,反之为大端机器。

2.定义一个16位整型数,并将其赋值为0x0001。

然后将该数的地址强制转换为指向char类型的指针,取出该指针指向的数据。


果该数据的值为0x01,则为小端机器,反之为大端机器。

3.使用联合体来判断机器大小端。

定义一个包含一个16位整型
数和一个8位字符数组的联合体,然后将该联合体的整型数成员赋值为0x0001。

如果联合体的数组成员的第一个元素的值为0x01,则为
小端机器,反之为大端机器。

以上三种方法都可以用来判断机器大小端,但是第三种方法是最常用的方法。

- 1 -。

存储器模式-大端小端

存储器模式-大端小端

存储器模式(大端、小端模式)C语言中判断大小端的方法有时候,用C语言写程序时需要知道是大端模式还是小端模式。

所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;小端模式相反。

为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。

但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。

因此就导致了大端存储模式和小端存储模式。

例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0 x22为低字节。

对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。

小端模式,刚好相反。

我们常用的X86结构是小端模式,而KEIL-C51则为大端模式。

很多的ARM,DSP都为小端模式。

有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式:short int x;char x0,x1;x=0x1122;x0=((char*)&x)[0]; //低地址单元x1=((char*)&x)[1]; //高地址单元若x0=0x11,则是大端; 若x0=0x22,则是小端......存储器模式(SMALL LARGE COMPACT)C51 提供了3 种存储器模式来存储变量过程参数和分配再入函数堆栈你应该尽量使用小存储器模式,很少应用系统需要使用其它两种模式。

像有大的再入函数堆栈系统那样一般来说如果系统所需要的内存数小于内部RAM 数时都应以小存储模式进行编译,在这种模式下DATA 段是所有内部变量和全局变量的默认存储段所有参数传递都发生在DATA 段中。

购买CPU需要知道这几个字母数字的含义:否则会被坑!

购买CPU需要知道这几个字母数字的含义:否则会被坑!

购买CPU需要知道这几个字母数字的含义:否则会被坑!*喜欢自己组装电脑的朋友或许对CPU的性能比较了解,但是你知道这些CPU的数字代表什么含义吗?首先英特尔的处理器有几个版本,我们最熟悉的就是酷睿系列,其次是志强,早些接触电脑的玩家可能最熟悉的是奔腾,赛扬系列。

而高端企业则用安腾,或者志强高端芯片。

首先聊聊酷睿系列,低端I3,中端I5,高端I7。

比如i5 4460和i5 4590,其中i字母没有任何含义,一个代号而已。

第二位5,代表中端芯片。

第三位4,代表第四代。

第四位和第五位,你只需要记得越大越好,比如4590强于4460。

I3和I5同理。

志强系类,高端E7,中端E5,低端E3,主要用于服务器市场,但是也能家用,看个人喜好。

E3作为入门级系类,性价比极高的有E3 1231 v3和E3 1230 v3。

E5是针对高端工作站及服务器的处理器系列,有五个子系列,入门的单路处理器系列E5-1400,高端的单路处理器系列E5-1600,入门级双路处理器系列E5-2400,主流级双路、四路处理器系列E5-2600及E5-4600。

E7是面向关键任务和数据中心的处理器系列,三个子系列,顶级的八路、四路及双路处理器系列E7-8800、E7-4800及E7-2800。

还有就是CPU代码最后字母有着不同含义。

K——代表可以超频处理器,需要主板支持。

M——代表移动版处理器,性能阉割一些。

U——超低功耗的处理器,性能比M差。

H——代表着有更强的核心显卡性能。

Q——代表是4核心处理器。

X——代表是至尊旗舰级别处理器。

以上就是主流的一些处理器字母数字的含义。

大端模式与小端模式

大端模式与小端模式

大端与小端存储模式详解端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。

这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile Endian(这句话最为形象)。

小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。

在计算机业Big Endian和Little Endian也几乎引起一场战争。

在计算机业界,Endian表示数据在存储器中的存放顺序。

下文举例说明在计算机中大小端模式的区别。

如果将一个32位的整数0x12345678存放到一个整型变量(int)中,这个整型变量采用大端或者小端模式在内存中的存储由下表所示。

为简单起见,本文使用OP0表示一个32位数据的最高字节MSB(Most Significant Byte),使用OP3表示一个32位数据最低字节LSB(Least Significant Byte)。

在较低的存储器地址。

大端:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址。

如果将一个16位的整数0x1234存放到一个短整型变量(short)中。

这个短整型变量在内存中的存储在大小端模式由下表所示。

大端方式将高位存放在低地址,小端方式将高位存放在高地址。

采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。

到目前为止,采用大端或者小端进行数据存放,其孰优孰劣也没有定论。

有的处理器系统采用了小端方式进行数据存放,如Intel的奔腾。

有的处理器系统采用了大端方式进行数据存放,如IBM半导体和Freescale的PowerPC处理器。

不仅对于处理器,一些外设的设计中也存在着使用大端或者小端进行数据存放的选择。

因此在一个处理器系统中,有可能存在大端和小端模式同时存在的现象。

C语言程序判断计算机的CPU大小端

C语言程序判断计算机的CPU大小端

如何判断一台计算机的CPU是大端还是小字端对齐呢?
那么首先得了解何为大端,何为小端,明确一下概念。

所谓大端模式,是指字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。

小端格式:与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。

那么如何使用C语言程序判断CPU是大端还是小端对齐呢?
有几个方法:
方法一:直接使用看变量的内存值,这里需要使用一些调试技巧。

方法二:使用C中的共用体:
请写一个C函数,若处理器是Big_endian的,则返回false;若是Little_endian的,则返回true。

bool IsLitte_Endian()
{
union w{
int a;
char b;
}c;
c.a=1;
return (c.b==1);
}
方法三:强制类型转换,和共用体的做法差不多。

bool IsLitte_Endian()
{
int wTest = 0x12345678;
short *pTest=(short*)&wTest;
return !(0x1234 == pTest[0]);
}。

处理器分档5分钟读懂变专家

处理器分档5分钟读懂变专家

处理器分档5分钟读懂变专家这两天有小伙伴求教怎么快速判断处理器高中低档,今天就推送给大家处理器速查辨别的方法——其实就是掌握型号规律,以后只要看一眼型号就大概知道这是什么档次的处理器了。

i社处理器排排坐先说最基本的,目前Intel的处理器大致按照性能排列顺序,“鄙视链条”是这样划分的:i9鄙视i7、i7鄙视i5、i5鄙视i3、i3鄙视奔腾、奔腾鄙视赛扬,然后还有E3教鄙视所有……以第7代处理器为例,i9是目前最高端的产品,热功耗设计是140W,而且要配合X299芯片组主板才能使用,和其他产品不通用,简言之,有钱的烧包请入坑;i7处理器是原本的玩家高端,现在也是,不过有了i9的出现,i7就不能当做旗舰产品了。

第7代i7处理器热功耗设计是91W,不推荐超小机机箱装机哦!i7绝对是游戏玩家的好选择。

另外,除了普通i7还有一种是尾号带K的产品,K代表着不锁频,可以配合Z170、Z270芯片组主板超频使用,装机成本没有8000元也差不多了;i5处理器是按理说应该是目前主流的配置,至少Intel是这么想的,但是无奈现在选择很多,i5多少有点尴尬——高不成低不就,价格千元级,性能表现又不如另一家好,还没有特点,至少他不超值(小编后面会说)。

当然,你要是个不想折腾的用户,i5是个不错的选择。

对了,i5也有一款尾号带K的不锁频版本:i5 7600K,不过买的人很少……第7代i3处理器最尴尬的是i3 7100,性能表现没比小弟奔腾G4560强多少,但是价格贵了几百元(现在没差那么多了……),着实不推荐,然后就是一个特殊的产品i3 7350K——猜对了,带K不锁频,不过一个超频主板就要700~1XXX元,怎么算怎么亏;奔腾在Intel第7代酷睿处理器系列中是一个独特的存在,尤其是G4560的出现,第一次带超线程的奔腾哦!性能非常好,甚至快要追上了i3 7100,导致价格一路涨啊涨,哎,说什么好呢?注意,G系列是奔腾桌面的主力,但不代表奔腾的全部序列,因为还有J、N两种类型的产品,但是这两种类型的产品多为高度集成化的,更适合比如HTPC媒体播放中心啊、小型设备使用,当不了主力电脑处理器的。

mips32和x86下的大小端模式判定

mips32和x86下的大小端模式判定

mips32和x86下的⼤⼩端模式判定⼀.背景1.1 mips32搭载32bit vxworks操作系统1.2 x86搭载64bit windows10操作系统⼆.看图三.⼤⼩端模式判定前的准备3.1 先要知道各种架构上各种整型数占据的bit数,也就是通过范围来确定bit数上⼀篇已经讲过,特奉上地址如下:3.2 mips32上的判定代码如下:#include <stdio.h>void main(void){ unsigned long int ul = 1; unsigned char *p = &ul; p += (sizeof(unsigned long) - 1); /*因为mips32上unsigned long 类型占据了32个bit,因此移动3个字节,以便到达最后⼀个字节*/ printf("*p = %d,p = %p,ul = %d,&ul = %p\n",*p,p,ul,&ul);}运⾏结果如下:*p = 1,p = 0x80cf3fcb,ul = 1,&ul = 0x80cf3fc8对运⾏结果进⾏分析如下:先回忆⼤⼩端的定义:⼤端模式: 低位数据存储在⾼地址⼩端模式:低位数据存储在低地址那么内存中数据的存放情况如下:-------------------0x80cf3fc8 | 0x00 | --------------------0x80cf3fc9 | 0x00 | --------------------0x80cf3fca | 0x00 |--------------------0x80cf3fcb | 0x01 |--------------------由此可以判定:笔者的mips32机器是⼤端机器(笔者的这台mips32机器是可以设置⼤⼩端的)3.3 x86上的判定代码如下:#include <stdio.h>void main(void){ unsigned long int ul = 1; unsigned char *p = &ul; p += (sizeof(unsigned long) - 1); /*因为x86上unsigned long 类型占据了64个bit,因此移动7个字节,以便到达最后⼀个字节*/ printf("*p = %d,p = %p,ul = %d,&ul = %p\n",*p,p,ul,&ul);}运⾏结果如下:*p = 0,p = 0xffffcc07,ul = 1,&ul = 0xffffcc00对运⾏结果进⾏分析如下:先回忆⼤⼩端的定义:⼤端模式: 低位数据存储在⾼地址⼩端模式:低位数据存储在低地址那么内存中数据的存放情况如下:-------------------0xffffcc00 | 0x01 | --------------------0xffffcc01 | 0x00 | --------------------0xffffcc02 | 0x00 |--------------------0xffffcc03 | 0x00 |--------------------0xffffcc04 | 0x00 | --------------------0xffffcc05 | 0x00 | --------------------0xffffcc06 | 0x00 |--------------------0xffffcc07 | 0x00 |--------------------由此可以判定:笔者的x86机器是⼩端机器。

c语言判断大小端 并转换

c语言判断大小端 并转换

c语言判断大小端并转换标题:C语言判断大小端并转换
引言概述:
在计算机领域中,大小端(Endianness)是指多字节数据在内存中存储的方式。

在C语言中,判断当前系统的大小端方式并进行转换是一项重要的任务。

本文将通过引言概述、正文内容和总结的方式,详细阐述C语言中如何判断大小端并进行转换。

正文内容:
1. 大小端的概念
1.1 大小端的定义
1.2 大小端的原理
2. 判断当前系统的大小端方式
2.1 使用联合体进行判断
2.2 使用指针进行判断
2.3 使用位操作进行判断
3. 转换大小端
3.1 使用位操作进行转换
3.2 使用库函数进行转换
3.3 使用循环进行转换
4. 大小端的应用
4.1 网络字节序与主机字节序的转换
4.2 文件读写时的大小端转换
4.3 数据库存储时的大小端转换
5. 注意事项与常见问题
5.1 跨平台兼容性问题
5.2 转换过程中的数据损失问题
5.3 大小端转换的性能问题
总结:
通过本文的介绍,我们了解了大小端的概念和原理,并学习了如何判断当前系统的大小端方式以及如何进行大小端转换。

同时,我们还了解到了大小端在实际应用中的重要性,例如在网络通信、文件读写和数据库存储中的转换。

最后,我们也提到了在进行大小端转换时需要注意的问题,如跨平台兼容性、数据损失和性能等方面。

掌握了这些知识,我们能够更好地理解和应用大小端相关的编程任务。

什么是大端模式,和小端模式

什么是大端模式,和小端模式

熟练掌握网络字节序的转换
大端转换
当主机A要把数据发送到主机B时,主机A需要把本机的字节 序转换为网络字节序后才能发送。
小端转换
当主机A收到从主机B发送的数据时,主机A需要把网络字节 序转换为本机的字节序后才能处理。
THANKS
感谢观看
模式。
06
大端模式和小端模式对我们 的启示
深入了解计算机存储机制
大端模式一种数据存储方式,其中高位字节保存在内存的低 地址中,而低位字节保存在内存的高地址中。这种存储方式 在机器字长为16位或32位时比较常见,但现在几乎所有的计 算机都是小端模式。
小端模式一种数据存储方式,其中低位字节保存在内存的低 地址中,而高位字节保存在内存的高地址中。这种存储方式 在机器字长为16位或32位时比较常见,但现在几乎所有的计 算机都是小端模式。
什么是大端模式,和小端模 式
xx年xx月xx日
目 录
• 引言 • 大端模式 • 小端模式 • 大端模式和小端模式的差异 • 大端模式和小端模式的判断方法 • 大端模式和小端模式对我们的启示
01
引言
什么是端模式
• 端模式(Endianness)是指计算机系统在处理字节顺序的方 式,也就是多字节数据在内存中如何排列。
存储顺序
在内存中存储数据时,大端模式将数据的每个字节按照由高到低的顺序存储,以 实现数据的正确表示。
大端模式的应用场景
网络通信
在网络通信中,数据的传输通 常是按照大端模式进行的,因 此需要将数据进行字节序的转 换,以确保接收和发送两端的
数据一致性。
文件存储
在某些文件格式中,如网络协 议中的数据包格式,需要按照 大端模式来读取和解析数据。
小端模式的原理

说明x86、arm、powerpc芯片的大小端

说明x86、arm、powerpc芯片的大小端

说明x86、arm、powerpc芯片的大小端
大小端是指在存储和读取多字节数据时,字节的排列顺序。

具体来说,大小端指示了字节的高位或低位在存储或传输时的排列顺序。

- x86架构中的处理器通常采用小端模式(Little-Endian)。

在小端模式下,多字节数据的低字节存储在低地址处,高字节存储在高地址处。

- ARM架构中的处理器可以支持小端模式和大端模式(Big-Endian)。

大多数ARM处理器采用小端模式,但某些特殊的ARM芯片(如ARM Cortex-A系列)支持切换成大端模式。

- PowerPC架构中的处理器通常采用大端模式。

在大端模式下,多字节数据的高字节存储在低地址处,低字节存储在高地址处。

大小端模式并没有绝对的优劣之分,不同的架构在设计上选择不同的大小端模式主要是出于历史原因和硬件设计上的考虑。

在跨平台开发时,需要注意不同架构的大小端模式可能会导致数据读取和传输的问题。

详解大端模式和小端模式

详解大端模式和小端模式

一、大端模式和小端模式的起源关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。

战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋的时候,必须先打破鸡蛋较小的一端,违令者重罚。

然后老百姓对此法令极为反感,期间发生了多次叛乱,其中一个皇帝因此送命,另一个丢了王位,产生叛乱的原因就是另一个国家Blefuscu的国王大臣煽动起来的,叛乱平息后,就逃到这个帝国避难。

据估计,先后几次有11000余人情愿死也不肯去打破鸡蛋较小的端吃鸡蛋。

这个其实讽刺当时英国和法国之间持续的冲突。

Danny Cohen一位网络协议的开创者,第一次使用这两个术语指代字节顺序,后来就被大家广泛接受。

二、什么是大端和小端Big-Endian和Little-Endian的定义如下:1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:1)大端模式:低地址-----------------> 高地址0x12 | 0x34 | 0x56 | 0x782)小端模式:低地址------------------> 高地址0x78 | 0x56 | 0x34 | 0x12可见,大端模式和字符串的存储模式类似。

3)下面是两个具体例子:16bit宽的数0x1234在Little-endian模式(以及Big-endian 模式)CPU内存中的存放方式(假设从地址0x4000开始存放)为:32bit宽的数0x12345678在Little-endian模式以及Big-endian 模式)CPU内存中的存放方式(假设从地址0x4000开始存放)为:4)大端小端没有谁优谁劣,各自优势便是对方劣势:小端模式:强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。

大端存储模式和小端存储模式

大端存储模式和小端存储模式

⼤端存储模式和⼩端存储模式CPU存储数据操作的最⼩单位是⼀个字节。

⼤端存储模式(Big-Endian),⼩端存储模式(Little-Endian)是常见的⼆种字节序。

Little-Endian:低位字节排放在内存的低地址端,⾼位字节排放在内存的⾼地址端。

Big-Endian:⾼位字节排放在内存的低地址端,低位字节排放在内存的⾼地址端。

⽐如0x12345678在内存中的表⽰形式为:采⽤⼤端模式:低地址 --------------------> ⾼地址0x12 | 0x34 | 0x56 | 0x78采⽤⼩端模式:低地址 --------------------> ⾼地址0x78 | 0x56 | 0x34 | 0x12也就是说Big-Endian是指低地址存放最⾼有效字节(MSB),⽽Little-Endian则是低地址存放最低有效字节(LSB)。

⼀般操作系统采⽤的都是⼩端模式,⽽通讯协议采⽤⼤端模式。

1)常见的CPU的字节序Big-Endian : PowerPC,IBM,SunLittle-Endian:x86ARM既可以⼯作在⼤端模式,也可以⼯作在⼩端模式。

2)常见的⽂件的字节序Adobe PS : Big-EndianBMP :Little-EndianGIF : Little-EndianJPEG:Big-Endian此外Java和所有的⽹络通信协议都是使⽤⼤端模式的编码事实上存在字节序,也存在⽐特序。

CPU存储⼀个字节的数据时其字节内的8个⽐特之间的顺序也有Big-Endian和Little-Endian之分。

⽐如字节0xA0的存储格式如下:Big-EndianMSB LSB-------------------------------->1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |Little-EndianLSB MSB-------------------------------->0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |实际上,由于CPU存储数据操作的最⼩单位是⼀个字节,其内部的⽐特序是什么样对我们的程序来说是⼀个⿊盒⼦,也就是说,你给我⼀个指向0xA0这个数的指针,对于Big-Endian⽅式的CPU来说,它是从左往右依次读取这个数的8个⽐特;⽽对于Little-Endian⽅式的CPU来说,则正好相反,是从右往左依次读取这个数的8个⽐特。

cpu的大端模式小端模式优劣对比

cpu的大端模式小端模式优劣对比

cpu的大端模式小端模式优劣对比一、大端模式和小端模式的起源二、什么是大端和小端Big-Endian和Little-Endian的定义如下:1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:2)小端模式:3)下面是两个具体例子: 4)大端小端没有谁优谁劣,各自优势便是对方劣势:三、数组在大端小端情况下的存储:以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value:Big-Endian: 低地址存放高位,如下:高地址--------------- buf[3] (0x78) -- 低位buf[2] (0x56) buf[1] (0x34) buf[0] (0x12) -- 高位--------------- 低地址Little-Endian: 低地址存放低位,如下:高地址--------------- buf[3] (0x12) -- 高位buf[2] (0x34) buf[1] (0x56) buf[0] (0x78) -- 低位--------------低地址四、为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。

但是在C语言中除了8bit 的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于五、如何判断机器的字节序可以编写一个小的BOOL IsBigEndian() { int a = 0x1234; char b = *(char *) //通过将int强制类型转换成char单字节,通过判断起始存储位置。

小端表示法

小端表示法

小端表示法简介在计算机科学中,计算机使用二进制表示数据。

而在内存中,这些二进制数据被存储为连续的字节序列。

为了能够正确读取这些数据,计算机需要一种方式来解释字节序列中的二进制信息。

其中一种常见的方式是使用小端表示法(Little Endian)。

什么是小端表示法?小端表示法是一种计算机的字节序排列方式。

在小端表示法中,较低的字节(低地址)被存储在内存中较低的位置,而较高的字节(高地址)被存储在内存中较高的位置。

这意味着数字的最低有效字节位于最前面,最高有效字节位于最后面。

小端表示法示例为了更好地理解小端表示法,我们来看一个示例。

假设我们要存储一个十六进制数0x12345678(注意:这里的表示形式是为了方便演示,并不是小端表示法的实际表示形式),它占用了4个字节。

在小端表示法中,将这个数存储到内存中时,最低有效字节0x78将排在最前面,紧随其后的是0x56,然后是0x34,最后是最高有效字节0x12。

因此,小端表示法下,0x12345678在内存中的存储形式是:0x78 0x56 0x34 0x12。

小端表示法与大端表示法的区别与小端表示法相对应的是大端表示法(Big Endian)。

在大端表示法中,较高的字节(高地址)被存储在内存中较低的位置,而较低的字节(低地址)被存储在内存中较高的位置。

这意味着数字的最高有效字节位于最前面,最低有效字节位于最后面。

为了对比小端表示法和大端表示法,我们还是以前面的例子为例。

在大端表示法中,0x12345678在内存中的存储形式是:0x12 0x34 0x56 0x78。

尽管小端表示法和大端表示法只是字节序的不同排列方式,但它们在一些场景下具有重要的意义。

小端表示法的应用小端表示法在计算机系统中有多种应用,包括以下几个方面:1. CPU架构小端表示法和大端表示法在硬件中的实现差异使得它们对CPU架构具有重要影响。

不同的CPU架构可能采用不同的字节序,这会影响到数据的读取和操作。

如何判断CPU是大端还是小端模式

如何判断CPU是大端还是小端模式

如何判断CPU是⼤端还是⼩端模式在ARM体系中,每个字单元包含4个字节单元或者两个半字单元。

在字单元中,4个字节哪⼀个是⾼位字节,哪⼀个是低位字节则有两种不同的格式:big-endian和little-endian格式。

在⼩端模式中,低位字节放在低地址,⾼位字节放在⾼地址;在⼤端模式中,低位字节放在⾼地址,⾼位字节放在低地址。

在C语⾔中,不同于结构体,共⽤体(联合体)中的⼏种不同类型的变量存放在同⼀段内存单元中。

利⽤这⼀特点,可以⽤联合体变量判断ARM或x86环境下,存储系统是是⼤端还是⼩端模式。

#include "stdio.h"int main(){union w{int a; //4 byteschar b; //1 byte} c;c.a=1;if (c.b==1)printf("It is Little_endian!\n");elseprintf("It is Big_endian!\n");return 1;}说明:1 在c中,联合体(共⽤体)的数据成员都是从低地址开始存放。

2 若是⼩端模式,由低地址到⾼地址c.a存放为0x01 00 00 00,c.b被赋值为0x01;————————————————————————————地址 0x00000000 0x00000001 0x00000002 0x00000003c.a 01 00 00 00c.b 01 00————————————————————————————3 若是⼤端模式,由低地址到⾼地址c.a存放为0x00 00 00 01,c.b被赋值为0x0;————————————————————————————地址 0x00000000 0x00000001 0x00000002 0x00000003c.a 00 00 00 01c.b 00 00————————————————————————————4 根据c.b的值的情况就可以判断cpu的模式了,现在XP环境下的intel CPU是⼩端模式,不信你可测试下!。

大端模式与小端模式、网络字节顺序与主机字节顺序

大端模式与小端模式、网络字节顺序与主机字节顺序

大端模式与小端模式、网络字节顺序与主机字节顺序1. 大端模式与小端模式1.1 概念及详解在各种体系的计算机中通常采用的字节存储机制主要有两种:big-endian和little-endian,即大端模式和小端模式。

先回顾两个关键词,MSB和LSB:MSB: Most Significant Bit ------- 最高有效位LSB:Least Significant Bit ------- 最低有效位1.1.1 大端模式(big-edian):MSB存放在最低端的地址上。

举例,假设双字节数0x1234以big-endian的方式存在起始地址0x00002000中:| data |<-- address| 0x12 |<-- 0x00002000| 0x34 |<-- 0x00002001在Big-Endian中,对于bit序列中的序号编排方式如下(以双字节数0x8B8A为例):bit | 0 1 2 3 4 5 6 7 | 8 9 10 11 12 13 14 15 |-----MSB-----------------------------------LSBval | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |+-----------------------------------------+= 0x8 B 8 A1.1.2 小端模式(little-endian):LSB存放在最低端的地址上。

举例,双字节数0x1234以little-endian的方式存在起始地址0x00002000中:| data |<-- address| 0x34 |<-- 0x00002000| 0x12 |<-- 0x00002001在Little-Endian中,对于bit序列中的序号编排和Big-Endian刚好相反,其方式如下(仍以双字节数0x8B8A为例):bit | 15 14 13 12 11 10 9 8 | 7 6 5 4 3 2 1 0 |-----MSB-----------------------------------LSBval | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |+-----------------------------------------+= 0x8 B 8 A1.2 数组在大端小端情况下的存储以unsigned int value = 0x12345678 为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value:Big-Endian: 低地址存放高位,如下:高地址---------------buf[3] (0x78) -- 低位buf[2] (0x56)buf[1] (0x34)buf[0] (0x12) -- 高位---------------低地址Little-Endian: 低地址存放低位,如下:高地址---------------buf[3] (0x12) -- 高位buf[2] (0x34)buf[1] (0x56)buf[0] (0x78) -- 低位--------------低地址1.3 大端小端转换方法Big-Endian转换成Little-Endian如下:#define BigtoLittle16(A) ((((uint16)(A) & 0xff00) >> 8) | \(((uint16)(A) & 0x00ff) << 8))#define BigtoLittle32(A) ((((uint32)(A) & 0xff000000) >> 24) | \ (((uint32)(A) & 0x00ff0000) >> 8) | \(((uint32)(A) & 0x0000ff00) << 8) | \(((uint32)(A) & 0x000000ff) << 24))1.4 大端小端检测方法如何检查处理器是big-endian还是little-endian?联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性就可以轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写:int checkCPUendian(){union{unsigned int a;unsigned char b;} un;c.a = 1;return (c.b == 1);}2. 网络字节顺序2.1 概述> 字节内的比特位不受这种顺序的影响比如一个字节 1000 0000 (或表示为十六进制80H)不管是什么顺序其内存中的表示法都是这样。

CPU的大小端及如果判断

CPU的大小端及如果判断

CPU的⼤⼩端及如果判断不同体系结构的CPU,数据在内存中存放的排列顺序是不⼀样的。

存储器中对数据的存储是以字节(Byte)为基本单位的,因此,字(Word)和半字(Half-Word)在存储器中就有两种次序,分别称为:⼤端模式(Big Endian)和⼩端模式(Little Endian)。

⼤端存储模式是指字或半字的最⾼字节(Most Significant Bit,MSB)存放在内存的最低位字节地址上,⽽字数据的低字节则存放在⾼地址中。

打个⽐⽅,有⼀个字为0×12345678,这个字由4个字节组成,从⾼位到低位的次序为:0×12,0×34,0×56,0×78。

⼤端模式的次序就像是我们平时书写的次序,先写⼤数,后写⼩数。

另外,⼤端存储次序还⼴泛运⽤在TCP/IP协议上,因此⼜称为⽹络字节次序。

⼩端存储模式是指字或半字的最低位字节(Lowest Significant Bit,LSB)存放在内存的最低位字节地址上,⽽字数据的⾼字节则存放在⾼地址中。

需要注意的⼏点是:(1)数据在寄存器中都是以⼤端模式次序存放的。

(2)对于内存中以⼩端模式存放的数据。

CPU存取数成时,⼩端和⼤端之间的转换是通过硬件实现的,没有数据加载/存储的开销。

⽤⼀个联合体判断⼤⼩端:int CheckEndian(void){union check{int Word;char Half;} Endian;Endian.Word=1;if(1 == Endian.Half)return Little_Endian;elsereturn Big_Endian;}。

详解大端模式和小端模式

详解大端模式和小端模式

详解大端模式和小端模式/ce123/article/details/6971544 转载一、大端模式和小端模式的起源关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。

战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋的时候,必须先打破鸡蛋较小的一端,违令者重罚。

然后老百姓对此法令极为反感,期间发生了多次叛乱,其中一个皇帝因此送命,另一个丢了王位,产生叛乱的原因就是另一个国家Blefuscu 的国王大臣煽动起来的,叛乱平息后,就逃到这个帝国避难。

据估计,先后几次有11000余人情愿死也不肯去打破鸡蛋较小的端吃鸡蛋。

这个其实讽刺当时英国和法国之间持续的冲突。

Danny Cohen一位网络协议的开创者,第一次使用这两个术语指代字节顺序,后来就被大家广泛接受。

二、什么是大端和小端Big-Endian和Little-Endian的定义如下:1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:1)大端模式:低地址 -----------------> 高地址0x12 | 0x34 | 0x56 | 0x782)小端模式:低地址 ------------------> 高地址0x78 | 0x56 | 0x34 | 0x12可见,大端模式和字符串的存储模式类似。

3)下面是两个具体例子:16bit宽的数0x1234在Little-endian模式(以及Big-endian模式)CPU内存中的存放方式(假设从地址0x4000开始存放)为:32bit宽的数0x12345678在Little-endian模式以及Big-endian 模式)CPU内存中的存放方式(假设从地址0x4000开始存放)为:4)大端小端没有谁优谁劣,各自优势便是对方劣势:小端模式:强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

如何判断CPU是大端还是小端模式
/s/blog_66a61f310100i7m0.html
MSB:Most Significant Bit ------- 最高有效位
LSB:Least Significant Bit ------- 最低有效位
大端模式(big-edian)
big-endian:MSB存放在最低端的地址上。

举例,双字节数0x1234以big-endian的方式存在起始地址0x00002000中:
| data |<-- address
| 0x12 |<-- 0x00002000
| 0x34 |<-- 0x00002001
在Big-Endian中,对于bit序列中的序号编排方式如下(以双字节数0x8B8A为例):
----+---------------------------------------------------+
bit | 00 01 02 03 04 05 06 07 | 08 09 10 11 12 13 14 15 |
----+MSB---------------------------------------------LSB+
val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |
----+---------------------------------------------------+
= 0x8B8A
小端模式(little-endian)
little-endian:LSB存放在最低端的地址上。

举例,双字节数0x1234以little-endian的方式存在起始地址0x00002000中:
| data |<-- address
| 0x34 |<-- 0x00002000
| 0x12 |<-- 0x00002001
在Little-Endian中,对于bit序列中的序号编排和Big-Endian刚好相反,其方式如下(以双字节数0x8B8A为例):
----+---------------------------------------------------+
bit | 15 14 13 12 11 10 09 08 | 07 06 05 04 03 02 01 00 |
----+MSB---------------------------------------------LSB+
val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |
----+---------------------------------------------------+
= 0x8B8A
c) 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。

网络字节顺序是“所见即所得”的顺序。

而Intel类型的CPU的字节顺序与此相反。

比如上面的 short B=0102H(十六进制,每两位表示一个字节的宽度)。

所见到的是“0102”,按一般数学常识,数轴从左到右的方向增加,即内存地址从左到右增加的话,在内存中这个short B的字节顺序是:
01 02
这就是网络字节顺序。

所见到的顺序和在内存中的顺序是一致的!
在ARM体系中,每个字单元包含4个字节单元或者两个半字单元。

在字单元中,4个字节哪一个是高位字节,哪一个是低位字节则有两种不同的格式:big-endian和little-endian 格式。

在小端模式中,低位字节放在低地址,高位字节放在高地址;在大端模式中,低位字节放在高地址,高位字节放在低地址。

在C语言中,不同于结构体,共用体(联合体)中的几种不同类型的变量存放在同一段内存单元中。

利用这一特点,可以用联合体变量判断ARM或x86环境下,存储系统是是大端还是小端模式。

#include "stdio.h"
int main()
{
union w
{
int a; //4 bytes
char b; //1 byte
} c;
c.a=1;
if (c.b==1)
printf("It is Little_endian!\n");
else
printf("It is Big_endian!\n");
return 1;
}
说明:
1 在c中,联合体(共用体)的数据成员都是从低地址开始存放。

2 若是小端模式,由低地址到高地址c.a存放为0x01 00 00 00,c.b被赋值为0x01;
————————————————————————————
地址0x00000000 0x00000001 0x00000002 0x00000003
c.a 01 00 00 00
c.b 01 00
————————————————————————————
3 若是大端模式,由低地址到高地址c.a存放为0x00 00 00 01,c.b被赋值为0x0;————————————————————————————
地址0x00000000 0x00000001 0x00000002 0x00000003
c.a 00 00 00 01
c.b 00 00 ————————————————————————————
4 根据c.b的值的情况就可以判断cpu的模式了,现在XP环境下的intel CPU是小端模式,不信你可测试下!
的确判别一个系统是大头序还是小头序的方法是有的。

比如:
-BEGIN-
int x=1; // 0x00000001
if (*(char*)&x) {
}else{
}
-END-
内存数据(0x00000001)-〉大头/小头字符序-〉数值(1)
这里判别的前提条件是知道内存数据及所对应的数值,所以可以判定出大小头字符序。

另外参考:/wxxweb/archive/2011/06/28/2092108.html
参考:大小端转换函数 /ysdaniel/article/details/6772392。

相关文档
最新文档