大端小端模式判断以及数据转换
简介
在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。考虑一个short整数0xAF32(0x32是低位,0xAF是高位),把它赋值给一个short变量,那么它在内存中的存储可能有如下两种情况:
- 大端字节(Big-endian):较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址。
- 小端字节(Big-endian):字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。
地址 0x2000 0x2001+-+-+-+-+-+-+-+-+ 大端存储 | 0xAF | 0x32 |+-+-+-+-+-+-+-+-+ 小端存储 | 0x32 | 0xAF |+-+-+-+-+-+-+-+-+
C函数判断大小端
判断计算机的存储方式:
// 是小端模式则返回1,否则返回0
int is_little_endian()
{union w{int x ;char y ;}c ;c.x = 1;return (c.y==1);
}
大端模式和小端模式转换
#include<stdio.h>typedef unsigned int uint_32 ;
typedef unsigned short uint_16 ;#define BSWAP_16(x) \(uint_16)((((uint_16)(x) & 0x00ff) << 8) | \(((uint_16)(x) & 0xff00) >> 8) \)
#define BSWAP_32(x) \(uint_32)((((uint_32)(x) & 0xff000000) >> 24) | \(((uint_32)(x) & 0x00ff0000) >> 8) | \(((uint_32)(x) & 0x0000ff00) << 8) | \(((uint_32)(x) & 0x000000ff) << 24) \)uint_16 bswap_16(uint_16 x)
{return (((uint_16)(x) & 0x00ff) << 8) | \(((uint_16)(x) & 0xff00) >> 8) ;
}
uint_32 bswap_32(uint_32 x)
{return (((uint_32)(x) & 0xff000000) >> 24) | \(((uint_32)(x) & 0x00ff0000) >> 8) | \(((uint_32)(x) & 0x0000ff00) << 8) | \(((uint_32)(x) & 0x000000ff) << 24) ;
}
int main(int argc,char *argv[])
{printf("------------带参宏-------------\n");printf("%#x\n",BSWAP_32(0x12345678));printf("%#x\n",BSWAP_16(0x1234)) ;printf("------------函数调用-----------\n");printf("%#x\n",bswap_32(0x12345678));printf("%#x\n",bswap_16(0x1234)) ;return 0 ;
}
两种模式的使用现状
Intel的80x86系列芯片是唯一还在坚持使用小端的芯片,ARM芯片默认采用小端,但可以切换为大端;而MIPS等芯片要么采用全部大端的方式储存,要么提供选项支持大端——可以在大小端之间切换。另外,对于大小端的处理也和编译器的实现有关,在C语言中,默认是小端(但在一些对于单片机的实现中却是基于大端,比如Keil 51C),Java是平台无关的,默认是大端。在网络上传输数据普遍采用的都是大端。
#include <stdio.h>
struct ST{short val1;short val2;
};
union U{int val;struct ST st;
};int main(void)
{int a = 0;union U u1, u2;a = 0x12345678;u1.val = a;printf("u1.val is 0x%x\n", u1.val);printf("val1 is 0x%x\n", u1.st.val1);printf("val2 is 0x%x\n", u1.st.val2);printf("after first convert is: 0x%x\n", htonl(u1.val));u2.st.val2 = htons(u1.st.val1);u2.st.val1 = htons(u1.st.val2);printf("after second convert is: 0x%x\n", u2.val);return 0;
}
shell命令判断大小端模式
dpkg-architecture
命令$ dpkg-architecture DEB_BUILD_ARCH=arm64 DEB_BUILD_ARCH_ABI=base DEB_BUILD_ARCH_BITS=64 DEB_BUILD_ARCH_CPU=arm64 DEB_BUILD_ARCH_ENDIAN=little DEB_BUILD_ARCH_LIBC=gnu DEB_BUILD_ARCH_OS=linux DEB_BUILD_GNU_CPU=aarch64 DEB_BUILD_GNU_SYSTEM=linux-gnu DEB_BUILD_GNU_TYPE=aarch64-linux-gnu DEB_BUILD_MULTIARCH=aarch64-linux-gnu DEB_HOST_ARCH=arm64 DEB_HOST_ARCH_ABI=base DEB_HOST_ARCH_BITS=64 DEB_HOST_ARCH_CPU=arm64 DEB_HOST_ARCH_ENDIAN=little DEB_HOST_ARCH_LIBC=gnu DEB_HOST_ARCH_OS=linux DEB_HOST_GNU_CPU=aarch64 DEB_HOST_GNU_SYSTEM=linux-gnu DEB_HOST_GNU_TYPE=aarch64-linux-gnu DEB_HOST_MULTIARCH=aarch64-linux-gnu DEB_TARGET_ARCH=arm64 DEB_TARGET_ARCH_ABI=base DEB_TARGET_ARCH_BITS=64 DEB_TARGET_ARCH_CPU=arm64 DEB_TARGET_ARCH_ENDIAN=little DEB_TARGET_ARCH_LIBC=gnu DEB_TARGET_ARCH_OS=linux DEB_TARGET_GNU_CPU=aarch64 DEB_TARGET_GNU_SYSTEM=linux-gnu DEB_TARGET_GNU_TYPE=aarch64-linux-gnu DEB_TARGET_MULTIARCH=aarch64-linux-gnu
lscpu
命令$ lscpu Architecture: aarch64 Byte Order: Little Endian CPU(s): 4 On-line CPU(s) list: 0-3 Thread(s) per core: 1 Core(s) per socket: 4 Socket(s): 1 Vendor ID: ARM Model: 4 Model name: Cortex-A53 Stepping: r0p4 CPU max MHz: 1296.0000 CPU min MHz: 408.0000 BogoMIPS: 48.00 L1d cache: unknown size L1i cache: unknown size L2 cache: unknown size Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
延伸阅读:
准确详解:C/C++ float、double数据类型的表示范围及精度
大端小端模式判断以及数据转换相关推荐
- 大端模式和小端模式判断
编写一个函数,判断处理器是Big_Endian的,还是是Little_Endian Big_Endian(大端)和Little_Endian(小端)的定义如下: a)Litte_Endian 就是低位 ...
- 大端小端模式以及相互转化
文章目录 概念 转化方法 应用 概念 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中.(Big-Endian) 小端模式,是指数据的高字节保存在内存的高地址中,而数 ...
- 大端小端模式(俗称大尾小尾模式)
转自百度百科 http://baike.baidu.com/link?url=uKVPtSaiXzEAXJSHfiya1Wj_oITw-t8MpHkJxJvMb0Eu_WXo28czAHLY-FOqj ...
- 大端小端模式及其判别方式
Little endian 和Big endian 是CPU 存放数据的两种不同顺序. 对于整型.长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据 ...
- 计算机是小端模式,计算机内的大小端模式
一.什么是大端与小端模式? 大端模式英文叫Big-Edian,小端模式英文叫little-Endian. 简单说: 大端模式:低字节存放在内存的低地址,高字节存放在内存的高地址(跟我们的一般思维相一致 ...
- 如何判断小端模式和大端模式
用指针判断大小端 #include<stdio.h> int main(void) {int a = 1;char b = (*(char *)(&a));if(1 == b){p ...
- 判断单片机MCU是大端还是小端模式
最近用杰理AC6966B调试博通的BK9527 U段发射芯片,一直没调通,经过测试IIC通讯是通,硬件还是好的,但是怎么都调不到与接收端成功连接. 最后咨询原厂得知提供的demo代码是大端编码模式的M ...
- 大端小端存储模式详解及判断方法
文章目录 大小端模式的概念 两种模式出现原因 两种模式的优劣 大小端的应用情景 判断机器的字节序 大小端模式的概念 当我们查看数据在内存中的存储情况时,我们经常会发现一个很奇怪的现象,什么现象呢? i ...
- 大端模式与小端模式的理解以及判断方法
1. 为什么会有大端模式和小端模式 在计算机中,我们知道数据是按照字节存储的,如果数据都是单字节存储,就不涉及存储顺序的问题.但是,大多数情况下,数据不是按照单字节的方式存储的,例如会有类似于int, ...
最新文章
- 【python】使用python脚本将LFW数据中1672组同一个人多张照片拷贝出来
- ubuntu中使用apt命令安装ipython失败解决方案
- SpringMvc+ajax实现文件跨域上传
- .NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper
- RGB to HSB or RGB to HSL
- Daily Scrum 11.18
- 从前端html 来限制删除去掉csdn页面广告
- 湖南计算机软件水平考试,2021年湖南省计算机软考职称考试 网络工程师 信息系统项目管理师报名考试...
- c7中取4c语言编程软件,c语言编程软件_C语言编程
- C#软件授权、注册、加密、解密模块源码解析并制作注册机生成license
- 远程重启h3c路由器_梅林路由怎么开启远程访问
- 如何选择合适的数据可视化BI工具
- 线段树(SegmentTree)学习笔记
- html表格两种颜色,html – 表格细胞两个颜色背景对角线
- 深度 ghost xp3 装IIS 方法
- php中文歌词,酷狗krc歌词解析并转换为lrc歌词php版
- 疯狂Java讲义(六)----第三部分
- imagej得到灰度图数据_Java图像处理最快技术:ImageJ 学习第一篇
- 全球与中国高炉系统(钢铁厂)市场深度研究分析报告
- t检验怎么分析结果python_使用python 批量 配对t检验 医学 基础研究 数据分析
热门文章
- php mysql倒计时_php 倒计时程序
- qfile指定从多少行开始_大牛进化路上之Linux基础命令,看看你了解多少?
- post获取重定向的链接 python_欧美音乐网站Python爬虫项目实战
- python弹出窗口后卡死_python的tkinter模块GUI编程为啥用了while循环之后就会使得程序出现卡死未响应崩溃?...
- vba php,VBA
- post大小限制_作为一个程序员,面试中常问的get和post的区别,你真的知道吗
- 排序算法 --- 堆排序
- php添加填空,PHP之preg_replace_callback(),将填空题的[[]]替换成______
- ios 贝塞尔曲线 颜色填充_iOS贝塞尔曲线(UIBezierPath)的基本使用方法
- 手机端使用ghelper_Anki手机端使用指南(一)