判断系统CPU是大端还是小端

判断CPU是大端还是小端 一、如何判断CPU是大端还是小端?明白大端和小端的区别,实现起来就非常简单:#include int main(){ union ut{   short s;   char c[2];  }u; if(sizeof(short) == 2) {  u.s = 0x0102;  if(u.c[0] == 1 && u.c[1] == 2)  {   printf("big enida 阅读详情

所谓的大端小端就是CPU在存储数据的时候是从高地址开始存储还是低地址开始存储。例如在sizeof(int) = 2的系统中,1 + (2 << 8)= 1 + 512 = 513,我们把这个值赋值给int nTemp = 1 + (2 << 8)。我们假定系统分配给变量nTemp的地址空间为:0x0000FF08到0x0000FF09,那么0x0000FF08开始的8个位为第一个字节的存储空间,0x0000FF09开始的8个位为第二个字节的存储空间。

如果CPU为大端,内存中的存储分配则为:

0x0000FF08:00000010(二进制) -> 2 (十进制)

0x0000FF09:00000001(二进制) -> 1 (十进制)

如果CPU为小端,内存中的存储分配则为:

0x0000FF08:00000001(二进制) -> 1 (十进制)

0x0000FF09:00000010(二进制) -> 2 (十进制)

那么如何判断系统CPU是大端还是小端呢???

我们可以利用C中的的共用体union和char类型,共用体的数据成员是共享存储空间的,而char类型在任何系统中都是一个字节。

我们可以定义一个共用体

union

{

char element[sizeof(int)];

int sum;

};

然后对共用体的sum进行赋值,只要判断element各个元素的值就可以知道系统CPU为大端,还是小端。因为共同体是共享存储的,我们这里假定测试系统sizeof(int)为2,那么element[0]的内容为sum存储空间中的第一个字节的内容,element[1]的内容为sum存储空间的第二个字节的内容。如果CPU为小端则表达式(int)(element[0]) + ((int)elememt[1] << 8)的值将等于sum。如果CPU的大端则表达式(int)(element[1]) + ((int)elememt[0] << 8)的值将等于sum。

下面给出可移植的代码来判断系统的CPU是大端还是小端。

 

#include <stdio.h>

#include <string.h>

union BigOrSmall 

{ 

char element[sizeof(int)]; 

int sum; 

}; 

bool checkBigOrSmall() 

{ 

int i; 

int j; 

char strTemp[9]; 

int nLen = sizeof(int); 

    BigOrSmall bigOrSmall; 

    bigOrSmall.sum = 0; 

for (i = 0; i < nLen; ++i) 

{ 

       bigOrSmall.sum += (i + 1) << (8 * (i));  

    } 

int sum = 0; 

for (i = 0; i < nLen; ++i)     { 

   sum += bigOrSmall.element[i] << (8 * (i)); 

} 

for (i = 0; i < nLen; ++i) 

    { 

      printf("the %d byte address:0x%08x ",i + 1, &bigOrSmall.element[i]); 

///从低到高取出bigOrSmall.element[i]的每一位

for (j = 0; j < 8; ++j) 

       { 

if (1 & (bigOrSmall.element[i] >> j)) 

{               strTemp[7 - j] = '1'; 

     } 

else

         {    strTemp[7 - j] = '0'; 

        } 

       } 

     strTemp[8] = 0; 

        printf("%s(bin) -> %d(dec)\n", strTemp, bigOrSmall.element[i]); 

    } 

 

if (sum == bigOrSmall.sum) 

    { 

return false;           ///小端

    } 

else

    { 

return true;            ///大端

    } 

} 

int main() 

{ 

if (checkBigOrSmall()) 

    { 

      printf("The type of cpu is big\n"); 

} 

else

{ 

      printf("The type of cpu is small\n"); 

  } 

return 0; 

} 

正确区分大小端模式 正确区分大小端模式 嵌入式开发经常会遇到大小端的问题,往往学习后,过一段时间就又忘记了,这里总结一下,希望给大家留下深刻的记忆。 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端和大端两种字节顺序,这两种你只需要深刻地记住其中的一种就可以,另一种恰好和它相反,不需要刻意记忆了,那么我们就记住“大端模式”吧。 大端模式(Big-Endian):是指数据的高字节保存在内存的... 阅读详情

相关推荐

从信号到振镜:STM32F103 + XY2-100协议 + AM26LS31芯片的激光打标/雕刻系统信号链搭建指南

本文详细介绍了基于STM32F103微控制器和XY2-100协议的激光打标/雕刻系统信号链搭建方法。从数字振镜控制协议解析、AM26LS31差分驱动电路设计到信号完整性优化,提供了一套完整的解决方案,帮助工程师实现高精度激光控制系统的开发与调试。

weixin_42536058的博客 236

判断系统CPU是大端还是小端 详解

判断系统CPU是大端还是小端 详解 所谓的大端小端就是CPU在存储数据的时候是从高地址开始存储还是低地址开始存储。例如在sizeof(int) = 2的系统中,1 + (2 )= 1 + 512 = 513,我们把这个值赋值给int nTemp = 1 + (2 。我们假定系统分配给变量nTemp的地址空间为:0x0000FF08到0x0000FF09,那么0x0000FF08开始的8个位为

个人独立博客http://www.acb0y.cn/ 6286

MatGPT:在MATLAB中集成AI助手,实现代码生成与调试自动化

大语言模型(LLM)通过API接口为开发者提供了强大的自然语言理解和代码生成能力,其核心原理是基于海量数据训练的Transformer架构,能够根据上下文预测并生成连贯的文本或代码。这一技术为工程实践带来了革命性价值,特别是在科学计算和算法开发领域,能够显著提升开发效率,实现智能化的代码辅助和问题解答。在实际应用中,开发者常需在IDE与AI工具间频繁切换,导致工作流中断。MatGPT作为一个开源项目,通过深度集成ChatGPT API到MATLAB环境,有效解决了这一痛点。它支持多模态输入、预设提示词管理和

weixin_42388898的博客 500

如何判断一个CPU架构是大端模式还是小端模式

union 联合体特点: 一、成员首地址相同,也就是通过不同的成员访问会从相同的起始地址开始取数据,至于取多少个地址的数据取决于具体成员的类型。 二、union内存空间的分配按照其占用内存最大的成员来进行分配 下面这段代码利用联合体的第一个特性来判断CPU的大小端模式:输出的如果是true,则为小端模式,否则是大端模式; #include<stdio.h> #include<stdlib.h> int checkcpu(void){ union w..

Linuxer_zxp的专栏 894

C++中为什么要引入引用变量?

C++引用机制的设计哲学在于平衡性能与安全性。它解决了指针的三个痛点:语法噪音、空指针风险和语义模糊,同时保持了指针的效率优势。引用必须绑定有效对象且不可重绑定的特性增强了安全性,其值语义语法更直观。尤其在运算符重载和const引用场景中,引用展现了不可替代的优势。本质上,引用是编译器优化的指针实现,体现了C++"零开销抽象"的核心思想——既保持底层性能,又提供高级抽象。这种设计允许开发者根据场景灵活选择指针或引用,反映了C++多范式共存的语言智慧。

教学 & 技术专栏 175

单片机课程设计——交通灯

单片机课程设计——交通灯一、课程设计主要内容1.1 题目1.2摘要1.3关键词二、设计要求三、设计方案四、参考电路设计4.1.1数码管的设计4.1.2对应程序4.2.1独立按键的设计4.2.2对应程序4.2.3 使用逻辑4.3.1LED模块的设置4.3.2 LED实物图4.3.3 LED显示程序五、调试要点5.1 单片机最小系统5.2 数码管模块5.3 LED模块5.4 独立按键六、总结七、成品图完整程序 一、课程设计主要内容 1.1 题目 交通灯设计 1.2摘要 近年来,随着我国国民经济的快速发展,我国机

PKPROTEUS的博客 3万+

怎么编写简单程序判断电脑是大端cpu还是小端cpu

电脑的cpu有两种,大端和小端cpu。 大端cpu: 所谓的大端,是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放; 小端: 所谓的小端,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分

wp1995的博客 3323

知识图谱的数据挖掘与分析

1. 背景介绍 1.1 数据挖掘的崛起 随着互联网的普及和大数据技术的发展,数据挖掘已经成为了计算机科学领域的热门研究方向。数据挖掘是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中,通过计算机科学、统计学、信息论等多学科交叉的方法,挖掘出有用信息和知识的过程。数据挖掘的目标是从数据中发现有

AI天才研究院 1600

判断CPU的大小端

原文出处:http://blog.sina.com.cn/s/blog_54f82cc201012c1k.html

u012089678的专栏 1378

Autosar CAN 网络管理标准文档

Autosar CAN 网络管理标准文档

蚂蚁小兵 925

DaVinci配置DID之三:代码实现

本系列主要基于DaVinCi工具链来展开具体DID读写的配置以及最终实现。1,CDD准备2,工具链配置3,代码实现4,验证结果本文讲述流程3话不多说,走你~博主是AutoSar小白,如果哪里表达的有问题,还请大佬们指点指点哈。接下来,让我们在下章关于测试验证的博文再相会哈~

weixin_48498880的博客 5361

如何确定一个机器的字节顺序是大端还是小端

什么是大/小端呢?所谓大端就是指高位值在内存中放低位地址,所谓小端是指低位值在内存中放低位地址。比如0x11223344在大端机上是11223344,在小端机上是44332211,而一个机器是大端还是小端要看cpu类型以及运行在上面的操作系统。同一款cpu在不同的操作系统使用的大小端情况是不同的。当然我们通常使用的x86+windows是小端。 那如何测试大小端呢? 通常的技巧是使用一

eddy_liu的专栏 897

如何理解S参数的三大特性

提到S参数的时候经常会涉及一些概念,如无源性、因果性、互易性等,本文逐一介绍这些特性的概念、成因以及判断方式。

一只豌豆象的博客 4499

大端模式小端模式

“大端”和“小端”可以追溯到1726年的Jonathan Swift的《格列佛游记》,其中一篇讲到有两个国家因为吃鸡蛋究竟是先打破较大的一端还是先打破较小的一端而争执不休,甚至爆发了战争。1981年10月,Danny Cohen的文章《论圣战以及对和平的祈祷》(On holy wars and a plea for peace)将这一对词语引入了计算机界(《程序设计实践》第9章)。这么看来,所谓大端

ligerendaqiu123的专栏 1094

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

大端模式和小端模式

一、什么是大端,什么是小端 0x123456在内存中的存储方式(以一个byte为一个单元) - 大端模式 低地址 -----> 高地址 0x12 | 0x34 | 0x56 - 小端模式 低地址 -----> 高地址 0x56 | 0x34 | 0x12 二、为什么会有大小端之分 1. 一开始是由于不同架构的CPU处理多个字节数据的顺序不一样,比如x86的是小端模式,KEIL C51是大端模式。但是后来互联网流行,TCP/IP协议规定为大端模式,为了跨平台通信,还专...

weixin_39461846的博客 352

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

c语言tips-大端小端存储介绍和使用union判断大小端

大端(Big Endian)和小端(Little Endian)是两种CPU或者计算机系统存储数据的方式。在大端系统中,数据的高位字节(MSB)存储在内存地址的低位,低位字节(LSB)存储在内存地址的高位,这种存储方式类似于阅读习惯,从左到右。在小端系统中,数据的低位字节存储在内存地址的低位,高位字节存储在内存地址的高位,这种存储方式和我们平时阅读数字的顺序是一致的,从右到左。假如我们有一个十六进制数0x12345678占用四个字节,如果它是大端存储将是以下画面:因为12是十六进制数。

留下虚度光阴的一些证据。 1704

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

大小端模式的判断和转化

大端模式:指的是数据低字节在内存高字节中,而数据高字节在内存低字节中,看上去跟人的阅读习惯类似。 小端模式:指的是数据低字节在内存低字节中,而数据高字节在内存高字节中。 PS:字有点差,见谅。。。 判断和转换代码: #include <iostream> using namespace std; // 判断是否是大端 bool isBig() { int var = 0...

GenmCai 478

一个程序判断CPU是大端还是小端

CPU的字节序分为大端模式和小端模式。 大端: 一个数据字的低位字节存放到高位地址,高位字节存放到低位字节。 小端相反。建议只记住一种,免得记混淆。 1 bool CheckCPUIsLittleEnd() 2 { 3 union w 4 { 5 int ...

weixin_34337265的博客 140

计算机大端与小端的详细解析,含判断机器大小端代码

在嵌入式开发中,大端(Big-endian)和小端(Little-endian)是一个很重要的概念。

勾栏听曲_0的博客 3840

第七课:大端存储和小端存储

文章详细介绍了大端存储和小端存储的含义及其使用方法

Mr-Gui的博客 1万+

C++ 关于大端模式和小端模式的简析

关于大小端的简析

一个程序猿的工作知识深化日常 885

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

一、什么是大端,什么是小端0x123456在内存中的存储方式- 大端模式 低地址 -----> 高地址 0x12 | 0x34 | 0x56 - 小端模式 低地址 -----> 高地址 0x56 | 0x34 | 0x12 不难看出大端模式比较符合人的直观认识二、为什么会有大小端之分1. 一开始是由于不同架构的CPU处理多个字节数据的顺序不一样,比如x86的是小段模式,...

weixin_39955142的博客 328

大端和小端存储

大小端是指数据在内存中的存储顺序:大端模式将高位字节存于低地址,小端模式则相反。

weixin_51883798的博客 286

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

如何判断CPU是大端还是小端模式 2010-12-03 23:35:25 分类: C/C++ 在ARM体系中,每个字单元包含4个字节单元或者两个半字单元。在字单元中,4个字节哪一个是高位字节,哪一个是低位字节则有两种不同的格式:big-endian和little-endian格式。在小端模式中,低位字节放在低地址,高位字节放在高地址;在大端模式中,低位字节放在高地址,高位字节放在低

680

存储中的大小端模式以及STM32的小端模式储存

(转)https://blog.youkuaiyun.com/ERTFYANG/article/details/81122993 存储模式: 小端:较高的有效字节存储在较高的存储器地址,较低的有效字节存储在较低的存储器地址。 大端:较高的有效字节存储在较低的存储器地址,较低的有效字节存储在较高的存储器地址。 STM32 属于小端模式,简单地说:比如:temp=0X12345678;假设temp的地址为:0X4000 0000 那么,在内存里面,其存储就变成了: | 地址 ...

SG_AiRobot的专栏 1572
上一篇: VC++的链接错误LNK2005
下一篇: getOwner与getParent的区别
heary29
博客等级 码龄12年 37粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值