大小端 た 入场券 2023-07-13 15:25 32阅读 0赞 # 大小端 # CPU架构: 1. PowerPC系列采用大端(big endian)的方式存储数据, 2. X86系列则采用小端(little endian)方式存储数据。 3. ARM芯片默认采用小端,但可以切换为大端; 编译器: 1. 在C语言中,默认是小端(但在一些对于单片机的实现中却是基于大端,比如Keil 51C) 2. Java是平台无关的,默认是大端 3. 在网络上传输数据普遍采用的都是大端。 在计算机系统中,我们是以**字节**为单位的,每个地址单元都对应着一个字节,一个字节为**8bit**。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器)。另外,对于**位数大于8位**的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果**将多个字节安排**的问题。因此就导致了大端存储模式和小端存储模式。 **大端模式(big endian)** :数据高位存储在内存低地址,低位对应高地址 ; **小端模式(little endian)**:数据高位存储在内存高地址,低位对应低地址 ; ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI0MDIxNjk1_size_16_color_FFFFFF_t_70] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI0MDIxNjk1_size_16_color_FFFFFF_t_70 1] int 型变量 a=0x12345678 占用 4 个字节, 在大端字节序的机器上,int 数据的高位位于低地址。 在小端字节序的机器上,int 数据的高位位于高地址。 # **VS2015 查看x86架构为小端表示** # 想要查看内存,局部变量等窗口的话,首先要确保在调试状态下(按F5或者按本地windows 调试器)进行,然后点击调试-》窗口-》内存即可;然后弹出一个窗口1, 将变量,一个unsigned char占一个地址。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI0MDIxNjk1_size_16_color_FFFFFF_t_70_pic_center] 1. **unsigned char 表示** ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI0MDIxNjk1_size_16_color_FFFFFF_t_70 2] 1. **unsigned short 表示** ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI0MDIxNjk1_size_16_color_FFFFFF_t_70 3] 1. **unsigned int 表示** ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI0MDIxNjk1_size_16_color_FFFFFF_t_70 4] 2. **unsigned long long 表示** ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI0MDIxNjk1_size_16_color_FFFFFF_t_70 5] # 内存相同表示 # 想要在CPU中按 **字节**为最小单位表示数组,则定义 typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; typedef unsigned long long u64; unsigned char a8[8] = { 0x01,0x23 ,0x45 ,0x67 ,0x89,0xab,0xcd,0xef }; unsigned short a16[4] = { 0x2301,0x6745 ,0xab89,0xefcd }; unsigned int a32[2] = { 0x67452301 ,0xefcdab89 }; unsigned long long a64[2] = { 0xefcdab8967452301 ,0x1}; 内存均为 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI0MDIxNjk1_size_16_color_FFFFFF_t_70 6] # 相互转换 # ![在这里插入图片描述][202003131118041.png] #include <stdio.h> typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; typedef unsigned long long u64; typedef int i32; #define LITTLE_ENDIAN //#define BIG_ENDIAN #define ROTR32(x,n) (((x)>>(n))|((x)<<(32-(n)))) #ifdef BIG_ENDIAN #define EXT_BYTE32(x,n) ((u8)((u32)(x)>>(8*(n)))) #define INS_BYTE32(x,n) ((u32)(x)<<(8*(n))) #define U32BIG(x) (x) #endif #ifdef LITTLE_ENDIAN #define EXT_BYTE32(x,n) ((u8)((u32)(x)>>(8*(3-(n))))) #define INS_BYTE32(x,n) ((u32)(x)<<(8*(3-(n)))) #define U32BIG(x) \ ((ROTR32(x, 8) & (0xFF00FF00)) | \ ((ROTR32(x, 24) & (0x00FF00FF)))) #endif //big endian void load64BIG(u64* x, u8* S) { int i; *x = 0; for (i = 0; i < 8; ++i) *x |= ((u64)S[i]) << (7 - i) * 8; } void store64BIG(u8* S, u64 x) { int i; for (i = 0; i < 8; ++i) S[i] = (u8)(x >> (7 - i) * 8); } //little endian void load64LIT(u64* x, u8* S) { int i; *x = 0; for (i = 0; i < 8; ++i) *x |= ((u64)S[i]) << i * 8; } void store64LIT(u8* S, u64 x) { int i; for (i = 0; i < 8; ++i) S[i] = (u8)(x >> i * 8); } #define NUM 16 int main() { u8 in[NUM], in1[NUM] = { 0 }, i; for (i = 0; i < NUM; i++) { in[i] = i; } printf("u8 :"); for (i = 0; i < NUM; i++) { printf("%02x,", in[i]); } printf("\n"); //U32 大小端 u32 a[4]; printf("\nu32:(big endian) :"); for (i = 0; i < NUM / 4; i++) { a[i] = U32BIG(((u32*)(in))[i]); printf("%08x,", a[i]); } printf("\nu32:(little endian):"); for (i = 0; i < NUM / 4; i++) { a[i] = ((u32*)(in))[i]; printf("%08x,", a[i]); } printf("\n"); //U64 大小端 u64 a1[4]; printf("\nu64:(big endian) :"); load64BIG(&a1[0], in); printf("%016llx,", a1[0]); store64BIG(in1, a1[0]); printf("\nu64:(little endian):"); load64LIT(&a1[0], in); printf("%016llx\n", a1[0]); store64LIT(in1, a1[0]); printf("\n"); return 0; } [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI0MDIxNjk1_size_16_color_FFFFFF_t_70]: /images/20230529/49ee2047ac5a422591c76203350ef201.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI0MDIxNjk1_size_16_color_FFFFFF_t_70 1]: /images/20230529/ba5461121f1544f3b26d74bebf8f6ecb.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI0MDIxNjk1_size_16_color_FFFFFF_t_70_pic_center]: /images/20230529/b2c8135393844af297955f862d4636ec.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI0MDIxNjk1_size_16_color_FFFFFF_t_70 2]: /images/20230529/ba9ff2717c0e4a2c891d3ac29fd094cf.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI0MDIxNjk1_size_16_color_FFFFFF_t_70 3]: /images/20230529/0936abc201fb497f9008d8db10281180.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI0MDIxNjk1_size_16_color_FFFFFF_t_70 4]: /images/20230529/471c26e04e5f477cbc4d83250797e6c2.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI0MDIxNjk1_size_16_color_FFFFFF_t_70 5]: /images/20230529/5027a4c2e1b2430a8280575ec3fdb425.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI0MDIxNjk1_size_16_color_FFFFFF_t_70 6]: /images/20230529/0f0b544d1028470ebd0ab634c368ea4a.png [202003131118041.png]: /images/20230529/01a9e72869b040cf9227b39f88befafa.png
相关 大小端(大小端设置对于8位单片机) 光缆成端接头(芯)光缆成端接头是按光缆的大小计算还是用了多少芯计 光缆成端接头是指上光交和熔接用户端的总计芯数,你接了多少芯就算多少成端的,你那个情况,那就是成端244芯 本是古典 何须时尚/ 2023年09月26日 14:14/ 0 赞/ 131 阅读
相关 大小端模式 大小端的由来 当数据类型为int,在32bit的系统中,它需要占用4个字节(32bit),这个时候就会产生这4个字节在寄存器中的存放顺序的问题。比如int x = 0x1 ╰半橙微兮°/ 2023年08月17日 16:43/ 0 赞/ 69 阅读
相关 判断大小端 举个列子,比如int a = 0x12345678,下图分别对应大小端不同的计算机的存储。 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shad 系统管理员/ 2023年07月17日 15:45/ 0 赞/ 12 阅读
相关 大小端 大小端 CPU架构: 1. PowerPC系列采用大端(big endian)的方式存储数据, 2. X86系列则采用小端(little endian)方式存储数据 た 入场券/ 2023年07月13日 15:25/ 0 赞/ 33 阅读
相关 检测大小端 可以使用共用体来检测当前系统的大小端,其借助了共用体的存放顺序的特点:即所有成员都从低地址开始申请空间。 include <stdio.h> uni 向右看齐/ 2022年09月26日 04:59/ 0 赞/ 171 阅读
相关 判断大小端 题目:你的电脑存储方式是大端存储还是小端存储 <span style="font-family:Microsoft YaHei;font-size:18px;">// 分手后的思念是犯贱/ 2022年09月22日 04:55/ 0 赞/ 325 阅读
相关 大小端模式 承接[《数组指针和指针数据》][Link 1]最后有个关于大小端的问题 上面这个问题似乎还没啥技术含量,下面就来个有技术含量的:在x86 系统下,其值为多少? int m Myth丶恋晨/ 2022年06月16日 05:10/ 0 赞/ 233 阅读
相关 大小端问题 CPU大小端两种检测方法 因为某些变量占用多个字节,一个字节对应一个地址,导致字节存放顺序的问题,产生了大小端的问题。 大端模式就是变量的高字节存储在低地址。 小 古城微笑少年丶/ 2022年06月09日 12:50/ 0 赞/ 224 阅读
相关 大小端 1.判断大端存储还是小端存储? 大端小端只在数据类型的长度超过一个字节时才有意义! 1.1 用共用体的方式 include<stdio.h> 末蓝、/ 2021年10月29日 15:44/ 0 赞/ 352 阅读
相关 大小端模式 1 什么大小端 大小端在计算机业界,Endian表示数据在存储器中的存放顺序。 小端模式:数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中 朱雀/ 2021年09月26日 02:28/ 0 赞/ 442 阅读
还没有评论,来说两句吧...