试题1:请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
int checkCPU( )
{
{
union w
{
int a;
char b;
} c;
c.a = 1;
return(c.b ==1);
}
}
剖析:
嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。32bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址
0x4000
0x4001
0x4002
0x4003
存放内容
0x78
0x56
0x34
0x12
而在Big-endian模式CPU内存中的存放方式则为:
内存地址
0x4000
0x4001
0x4002
0x4003
存放内容
0x12
0x34
0x56
0x78
联合体union的存放顺序是所有成员都从低地址开始存放的。
以上是网上的原文。让我们看看在ARM处理器上union是如何存储的呢?
地址A
---------------------------------
|A |A+1 |A+2 |A+3 |int a;
| | | | |
---------------------------------
|A |char b;
| |
---------
如果是小端如何存储c.a的呢?
地址A
------------------------------------
|A |A+1 |A+2 |A+3 | int a;
|0x01 |0x00 |0x00 |0x00 |
-------------------------------------
|A |char b;
| |
---------
如果是大端如何存储c.a的呢?
地址A
------------------------------------------
|A |A+1 |A+2 |A+3 |int a;
|0x00 |0x00 |0x00 |0x01 |
------------------------------------------
|A |char b;
| |
---------
现在知道为什么c.b==0的话是大端,c.b==1的话就是小端了吧。
以下是别人给出的一些传输解决方案:
http://bbs2.chinaunix.net/thread-1385066-1-1.html
另外一段代码:
1 #include <stdio.h>
2
3 int main()
4 {
5 int i = 0x0001;
6 (char)i ? printf("s\n") : printf("b\n");
7 return 0;
8 }
分享到:
相关推荐
### 解析大端模式和小端模式 在计算机科学领域,数据存储格式是理解硬件与软件交互的关键之一。其中,字节序(Byte Order)是一个重要概念,它指的是多字节数据类型(如整数、浮点数等)在内存中的存储顺序。目前...
### iOS 大端格式和小端格式 #### 一、概念与原理 计算机系统中,对于多字节数据类型的处理存在两种不同的字节顺序:**大端格式**(Big-endian)与**小端格式**(Little-endian)。这两种格式的区别在于如何在内存...
检测系统是使用大端模式还是小端模式 将系统字节序和网络字节序进行转换 使用C++代码实现 基于Visual Studio 2022
判断CPU是大端还是小端,可以通过编程进行检测。上述代码中,定义了一个union,它包含一个int型变量num和一个char型变量ch。当num被赋值为1时,如果数据存储为小端模式,那么1会被存储在ch的低字节,因此data.ch的值...
在编程中,判断大端模式和小端模式可以使用以下代码: ```c void find_cpu_endian(void) { int x = 1; if(*(char*)&x == 1) cpu_endian = 0; // 小端模式 else cpu_endian = 1; // 大端模式 } ``` 这个函数...
golang语言如何判断机器的大小端? 如下代码供参考: 代码如下: package main import ( “fmt” “unsafe” ) const N int = int(unsafe.Sizeof(0)) func main() { x := 0x1234 p...
不过,ARM架构具有双端模式支持,可以根据需要配置为大端或小端模式,使得其在不同平台间移植更为方便。 3. 判断CPU大小端模式的方法: 判断CPU端模式的经典方法主要有两种,这里通过C语言编程实例进行介绍。 ...
例如,Intel x86和x64系列处理器使用小端模式,而Motorola 68000和PowerPC系列则采用大端模式。 面试中,能够熟练地解释和解决大小端问题可以展示出对底层计算机系统有深入的理解。下面我们将详细探讨如何在C/C++中...
识别系统是大端模式还是小端模式有多种方法: 方法1:通过直接存储和比较。这是最直接且常用的方法。创建一个32位整数0x12345678,然后将其地址转换为8位整数指针,比较第一个字节是否为0x12。如果是,则为大端模式...
2. **性能影响**:虽然大端存储符合人类的认知习惯,但小端存储方式更有利于CPU的数据处理,特别是在某些架构中,小端模式能够提高访问速度。 #### 检测系统字节序 为了确定当前系统的字节序,可以通过编写简单的...
标题中的"little_ending.zip_大端"表明这个压缩包可能包含了关于识别小端内存模型的代码或资源。"大端"标签进一步确认了这个主题。压缩包内的文件包括`is_little_endian.c`,这很可能是一个C语言编写的源代码文件,...
在小端系统中,低字节存储在内存地址较低的位置,而在大端系统中,高字节位于低地址。为了确保程序在大小端系统上都能正确工作,你需要在写入数据到CRC单元前,根据系统字节序进行适当的调整。例如,对于32位整型,...
通过这种方式,可以判断出当前运行环境是否为大端字节序系统或小端字节序系统,从而采取相应的字节序转换措施。 ### 结论 综上所述,字节序在计算机科学中是一个重要的概念,尤其是在涉及到跨平台编程和网络通信的...
该项目是一个基于C语言的联合体判断大小端的设计源码,共计包含26个文件,涵盖多种文件类型,如日志文件、索引文件、调试信息文件、解决方案文件、源代码文件、目标文件等。该设计源码适用于需要判断和适应不同大小...
最后,提供了一段C语言代码示例,演示如何在小端和大端字节序之间转换数据。通过对unsigned int类型的数据进行位操作,可以实现不同字节序之间的转换,体现了C语言位操作的强大功能。 总之,字节序的选择不仅影响...
该函数通过创建一个联合体,并在其中同时定义`unsigned int`和`unsigned char`类型的变量,然后将整型变量设置为1,检查联合体中字符型变量的值是否为1来判断当前系统是否为小端字节序。如果是,则返回1,否则返回0...
### C语言检测CPU大小端模式 #### 知识点概览 本文主要介绍两种方法来检测CPU的大端或小...此外,值得注意的是,像x86架构的CPU通常采用小端模式,而ARM架构的CPU则可能支持大端或小端模式,这取决于具体的硬件配置。