判断处理器是大端模式还是小端模式
前言
这是一个古老而基础的问题,小代码,能够解决大问题。大框架的问题,就藏在小细节中。越大的框架,这种小细节藏的越深。为什么要区分大小端模式?难道不会有中端模式吗?
一 基本原理与内存图
下面的内存视图的地址是递增的。
例如一个32位整形
uint32_t num = 0x12345678;
采用大端模式存储的内存视图:
0x80000001: 12 34 56 78 00 00 00 00 00 00 00 00 00 00 00 00
也可以做写作:
0x80000001: 12
0x80000002: 34
0x80000003: 56
0x80000004: 78
采用小端模式存储的内存视图:
0x80000001: 78 56 43 12 00 00 00 00 00 00 00 00 00 00 00 00
相对清晰的视图
0x80000001: 78
0x80000002: 56
0x80000003: 43
0x80000004: 12
二 使用指针验证大小端模式
#include <stdio.h>
#include <stdint.h>
int main(void)
{uint32_t num = 0x12345678;uint8_t *c = (uint8_t*)#int i = 0;printf("c = 0x%x\n",*c);if(*c == 0x12){printf("big endian\n");}else if(*c == 0x78){printf("little endian\n");}else{printf("error\n");}for(i = 0;i < sizeof(uint32_t);i++){printf("c[%d]=0x%x ",i,c[i]);}printf("\n");return 0;
}
测试结果:如果输出0x78,那就是小端模式,如果输出0x12那就是大端模式。
lkmao@ubuntu:~$ ./a.out
c = 0x78
little endian
lkmao@ubuntu:~$
二 使用共用体验证大小端模式
#include <stdio.h>
#include <stdint.h>
union endian{uint32_t num;uint8_t c;
};
int main(void)
{union endian e;e.num = 0x12345678;printf("e.c = 0x%x\n",e.c);printf("e.num = 0x%x\n",e.num);if(e.c == 0x12){printf("big endian\n");}else if(e.c == 0x78){printf("little endian\n");}else{printf("error\n");}return 0;
}
测试结果
lkmao@ubuntu:~$ ./a.out
e.c = 0x78
e.num = 0x12345678
little endian
lkmao@ubuntu:~$
四 相对正规的写法
在该示例中,is_little_endian函数中定义了一个匿名共用体,并定义了一个共用体变量e。如果e.c等于1则返回为真,属于小端模式,否则就是大端模式。
#include <stdio.h>
#include <stdint.h>
int is_little_endian(void)
{union {uint32_t num;uint8_t c;}e;e.num = 1;return e.c;
}
int main(void)
{if(!is_little_endian()){printf("big endian\n");}else{printf("little endian\n");}return 0;
}
二维地址空间就是二维存储空间吗?
我们熟知的内存计算策略是二元的,要么向左(递减),要么向右(递减)。在很久以前,经常使用两个8位的内存芯片级联为一个16位的内存芯片,在CPU中存储的16位数据,很可能高8位数据存放在内存芯片1,而低八位数据存放在内存芯片2。在地址空间上,他们是连续的,在存储空间上,他们是分别位于两颗不同的芯片。类似的原理在数据库中叫分片存储。
小结
。。。
判断处理器是大端模式还是小端模式相关推荐
- 【已解决】如何判断处理器是大端,或小端?
去年11月份的面试题,今天有空整理出来了,算是总结. ************************************************************ 大端.小端指对操作数的存 ...
- 大端模式与小端模式的理解以及判断方法
1. 为什么会有大端模式和小端模式 在计算机中,我们知道数据是按照字节存储的,如果数据都是单字节存储,就不涉及存储顺序的问题.但是,大多数情况下,数据不是按照单字节的方式存储的,例如会有类似于int, ...
- 判断大端模式和小端模式
测试自己的电脑是大端模式还是小端模式 问题引入: CPU内部寄存器是按bit位来存储信息的,但是内部寄存器的数量是非常有限的,所有我们经常要把寄存器的数据存储到内存中.但是内存不是按bit位来存储信息 ...
- 计算机大端模式和小端模式 内存对齐问题(sizeof)
目录(?)[+] 一大端模式和小端模式的起源 二什么是大端和小端 三数组在大端小端情况下的存储 四为什么会有大小端模式之分呢 五如何判断机器的字节序 内存对齐问题 再讲讲pragma pack 内存对 ...
- 大端模式与小端模式的详解分析
大端序与小端序 何为大端序,小端序? 简单点说,就是字节的存储顺序,如果数据都是单字节的,那怎么存储无所谓了,但是对于多字节数据,比如int,double等,就要考虑存储的顺序了.注意字节序是硬件层面 ...
- 嵌入式基础01【转载】详解大端模式和小端模式
---------------- 版权声明:本文为CSDN博主「ce123」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog. ...
- 大端模式和小端模式的区别
一.什么是大端和小端 Big-Endian和Little-Endian的定义如下: Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端. Big-Endian就是 ...
- 详解大端模式和小端模式【转】
详解大端模式和小端模式 一.大端模式和小端模式的起源 本文转载自:http://blog.csdn.net/ce123/article/details/6971544 关于大端小端名词的由来,有一个有 ...
- 【转】大端模式与小端模式、网络字节顺序与主机字节顺序 (经典)
大端模式与小端模式 一.概念及详解 在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式. 先回顾两个关键词,MSB和LSB: ...
- 大端模式、小端模式、网络字节顺序与主机字节顺序
大端模式.小端模式.网络字节顺序与主机字节顺序 大端模式与小端模式 概念与详解 在各种体系的计算机中通常采用的字节存储机制主要有两种:big-endian和little-endian,即大端模式和小端 ...
最新文章
- 替换Android系统镜像system.img的方法
- R语言ggplot2可视化分面直方图(faceting histogram)、使用gghighlight包突出高亮突出每个分面中的一个分组的直方图
- node mysql 连接池 超时,关于NodeJS中mysql连接池卡死问题
- UA MATH564 概率论I 求离散型随机变量的分布1
- 如何使用IcoMoon字体图标
- SuperSocket入门(二)- 探索AppServer、AppSession,Conmmand和App.config
- java 调用.net webservice axis2_java利用axis2调用.net写的webservice,传递自定义的实体类参数...
- 鸿蒙不是安卓也不是Linux
- CPU高速缓存SRAM命中问题的总结与实验
- Nokia n900使用
- kafka_2.10-0.8.1.1.tgz的1或3节点集群的下载、安装和配置(图文详细教程)绝对干货...
- Java 加密解密之对称加密算法PBE
- img里的align属性能保证图文的混排效果以及vspace和hspace
- 蜂窝物联网与嵌入式SIM(eSIM)
- 2022-03-25 redis哨兵处理failover
- Android探索之旅(第二十九篇)手把手教你如何简单创建快应用
- 02 FinalReference.referent的回收时机
- Windows远程桌面连接后被连接的桌面锁屏
- 2017-10-19 远光软件Java开发面试+达达京东到家笔试总结
- VC#复习资料(是轩~)