写一个C函数判断处理器是大端还是…

本文介绍了如何通过C语言编写一个函数来判断处理器是大端模式还是小端模式。利用联合体union的特性,当一个整数在内存中存储时,可以通过比较其低字节是否为1来确定字节序。大端模式将高字节存储在低地址,而小端模式则相反。示例代码展示了具体的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先我们介绍一个联合体的概念。

       在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体,也叫联合体。

联合体的特别之处

 “联合”与“结构”有一些相似之处。但两者有本质上的不同。在结构中各成员有各自的内存空间,一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。应该说明的是,这里所谓的共享不是指把多个成员同时装入一个联合变量内,而是指该联合变量可被赋予任一成员值,但每次只能赋一种值,赋入新值则冲去旧值。如前面介绍的“单位”变量,如定义为一个可装入“班级”或“教研室”的联合后,就允许赋予整型值(班级)或字符串(教研室)。要么赋予整型值,要么赋予字符串,不能把两者同时赋予它。联合类型的定义和联合变量的说明一个联合类型必须经过定义之后,才能把变量说明为该联合类型。


Big-endian是一种大值的一端(序列中更典型值)存在前面(在最小的存储地址)的顺序。Little-endian是一种小值的一端(序列中较不典型的值)存储在前的顺序。

intel的微处理器一般是小端模式,IBM的370主机,多数基于RISC计算机,和Motorola的微处理器使用big-endian方法。TCP/IP也使用big-endian方法(因此big-endian方法也叫做网络编码)。


C笔试题

(判断大端小端模式) 试题1:请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1。

解答:

#include<stdio.h>

int checkCPU()

{

union w

 

int a;

char b;

}c;

c.a 1;

return(c.b ==1);

}


int main()

{

int state 0;

state checkCPU();

printf("state %d\n", state);

return 0;

}


剖析:

嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址
0x4000
0x4001

存放内容
0x34
0x12

而在Big-endian模式CPU内存中的存放方式则为:

内存地址
0x4000
0x4001

存放内容
0x12
0x34

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的存放顺序是所有成员都从低地址开始存放,面试者的解答利用该特性,轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写。如果谁能当场给出这个解答,那简直就是一个天才的程序员。


另外个例子:

#include <stdio.h>

int main()
{
 union ut{
   short s;
   char c[2];
  }u;

 if(sizeof(short) == 2)
 {
  u.s 0x0102;
  if(u.c[0] == && u.c[1] == 2)
  {
   printf("big enidan\n");
  }else if(u.c[0] == && u.c[1] == 1)
  {
   printf("little endian.\n");
  }
  return 0;
 }
}


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值