什么是大小端?如何确定大小端?
一、什么是大小端?
对于一个由2个字节组成的16位整数,在内存中存储这两个字节有两种方法:一种是将低序字节存储在起始地址,这称为小端(little-endian)字节序;另一种方法是将高序字节存储在起始地址,这称为大端(big-endian)字节序。
假如现有一32位int型数0x12345678,那么其MSB(Most Significant Byte,最高有效字节)为0x12,其LSB (Least Significant Byte,最低有效字节)为0x78,在CPU内存中有两种存放方式:(假设从地址0x4000开始存放)
总结:
大端是高字节存放到内存的低地址
小端是高字节存放到内存的高地址
二、如何确定大小端
有些CPU公司用大端(譬如C51单片机);有些CPU用小端(譬如ARM)。(大部分是用小端模式,大端模式的不算多)。于是乎我们写代码时,当不知道当前环境是用大端模式还是小端模式时就需要用代码来检测当前系统的大小端。下面给出用程序判断大小端的两种方法:
#include <stdio.h>// 共用体中很重要的一点:a和b都是从u1的低地址开始存放的。
// 假设u1所在的4字节地址分别是:0、1、2、3的话,那么a自然就是0、1、2、3;
// b所在的地址是0而不是3.union myunion
{int a;char b;
};// 如果是小端模式则返回1,小端模式则返回0
int is_little_endian(void)
{union myunion u1;u1.a = 0x12345678; // 地址0的那个字节内是0x78(小端)或者0x12(大端)if(0x78 == u1.b)return 1;else if(0x12 == u1.b)return 0;
}int is_little_endian2(void)
{int a = 0x12345678;char b = *((char *)(&a)); // 指针方式其实就是共用体的本质if(0x78 == b)return 1;else if(0x12 == b)return 0;
}int main(void)
{int i = is_little_endian2();//int i = is_little_endian();if (i == 1){printf("小端模式\n");}else{printf("大端模式\n");}return 0;
}
下面给出三种确定大小端错误的方案
// 强制类型转换
int a;
char b;
a = 1;
b = (char)a;
printf("b = %d.\n", b);
// 移位
int a, b;
a = 1;
b = a >> 1;
printf("b = %d.\n", b);
// 位与
int a = 1;
int b = a & 0xff; // 也可以写成:char b = a & 0x01;
printf("b = %d.\n", b);
位与、移位、强制类型转换等运算是编译器提供的运算,这个运算是高于内存层次的(或者说这些运算在二进制层次具有可移植性,也就是说&的时候一定是高字节&高字节,低字节&低字节,和二进制存储无关)。
REF:
朱有鹏课堂笔记
什么是大小端?如何确定大小端?相关推荐
- 关于rem移动端 html字体大小自适应设置的问题
rem是个单位,单位大小由它第一代祖先font-size的大小决定rem的大小. 了解字体大小的同时我们要知道像素是什么东西. 像素是屏幕的组成元素,我们看到屏幕上的内容都是由一个个小颗粒构成的,而这 ...
- html字大小自适应,html字体大小自适应 怎样让HTML字体自适应到移动端?
如何设置 中的字体大小随 height变化而自 first line html如何实现字体大小的自适应字体的单位用百分比即可. html页面怎样能够自适应电脑屏幕宽度? 在1024*768或者800* ...
- html5移动页面自适应手机屏幕大小,页面完美自适应移动端屏幕的方法
码农公社 210.net.cn 210是何含义?10月24日是程序员节,1024 =210.210既 210 之意. 移动端由于展示区域比较小,页面在不同分辨率手机上的展示细节也被要求得更加严格, ...
- html移动端最小字体大小,踩坑之移动端显示字体大小问题
踩到的第一个坑: 最近做一个移动端的h5,一开始拿到设计稿后,发现有几个区域字体换算之后在iphone6上是小于12px的,就有一个问题了,谷歌对小于12px的字体,是不做处理的.按理说,设计上应该要 ...
- 汇编码转机器码万能转换工具(Intel 32/64、ARM 大小端、Thumb大小端、ARM V8大小端、Thumb V8大小端、AArch64)
汇编码转机器码万能转换工具(Intel 32/64.ARM 大小端.Thumb大小端.ARM V8大小端.Thumb V8大小端.AArch64) 众所周知,计算机核心处理器就是CPU是计算机的重要组 ...
- html5 移动端字体问题,踩坑之移动端显示字体大小问题
踩到的第一个坑: 最近做一个移动端的h5,一开始拿到设计稿后,发现有几个区域字体换算之后在iphone6上是小于12px的,就有一个问题了,谷歌对小于12px的字体,是不做处理的.按理说,设计上应该要 ...
- PC端和移动APP端CSS样式初始化
CSS样式初始化分为PC端和移动APP端 1.PC端:使用Normalize.css Normalize.css是一种CSS reset的替代方案. 我们创造normalize.css有下面这几个目的 ...
- 差分放大电路单端输出和双端输出区别以及应用(转载)
来自:http://www.elecfans.com/news/dianzi/20171118581901_a.html 什么是差分放大电路 差分放大电路利用电路参数的对称性和负反馈作用,有效地稳定静 ...
- android webview 字体 系统字体大小,Android 系统字体大小动态改变,导致webview中显示不兼容的问题解决...
唠叨几句: 在移动端再开发的过程中,很容易使用到webview,它也是用来混合开发的中间桥梁,因此解决webview使用过程中出现的问题是非常有必要的: 问题现象与发现: 现象: 日前,在是使用web ...
- 修改服务器的共享内存大小,服务器共享内存大小能改么
服务器共享内存大小能改么 内容精选 换一换 开发者板形态下,使用16路推理进程并发对1080P图片进行处理,导致内存耗尽,内存申请失败后进程退出.为了防止抖动,默认情况下Engine队列大小为200, ...
最新文章
- 斯坦福CS330 2019秋季课程视频全新上线,专注多任务与元学习
- 【 FPGA 】设置多周期路径约束
- ETSI GS MEC 013,UE 位置 API
- 全国计算机一级ms office考试难吗,全国计算机等级考试一级msoffice难考吗?_联展教育问答...
- [iPhone高级] 基于XMPP的IOS聊天客户端程序(XMPP服务器架构)
- 创建基于MailKit和MimeKit的.NET基础邮件服务
- 一次开发、多端分发,阿里巴巴发布AliOS车载小程序
- JS 函数参数arguments对象(实例)
- Objections vs. excuses
- javascript演变史_检查有史以来最著名JavaScript错误之一
- HDU 4597 Play Game (记忆化搜索博弈DP)
- 光敏电阻、光电二三极管及接收头
- 计算机硕士工资一览表 (时间有点久远了)
- 局域网同步服务器系统时间,局域网中如何设置系统时间与服务器同步
- 安装gfortran
- java对接支付宝当面付
- 章立民老师北京中关村图书大厦讲座
- pgbackrest配置监控、冗余策略
- go语言基础之浮点数
- 中国系统java开发面试准备
热门文章
- 五年Android开发大厂面经总结,吐血整理2022Android面试题合集(符解析)你确定不看看?
- Sparkling Logic SMARTS 实时决策分析模块介绍
- mingw32-make[1]: *** [debug/qrc_resource.cpp] Error 1
- 无人机倾斜摄影测量影像处理关键技术
- 华为测试岗面试经验(附面试流程)
- Sniffer报文放送
- CPU架构之ARM优化
- android gatekeeper(locksetting密码锁)学习这一篇就够了
- Ubuntu 桌面便签小工具-Indicator Stickynotes
- 3D打印机硬件驱动-马林固件最新版本2.0.X中文注释(1)marlin 2.0.9.2 截至发稿时间2021年12月16日