计算机字节序(大小端)核心原理与代码实战

目录

第一篇:字节序本质|CPU、寄存器、存储器核心关系

一、核心硬件分工

二、字节序诞生原理

三、大小端可视化定义

[第二篇:核心代码验证|存储逻辑与 printf 输出机制](#第二篇:核心代码验证|存储逻辑与 printf 输出机制)

一、验证代码

二、小端环境标准输出

三、核心逻辑解析

[1. 数据 Store 存储逻辑](#1. 数据 Store 存储逻辑)

[2. int 整型 printf 输出逻辑](#2. int 整型 printf 输出逻辑)

[3. char 逐字节输出逻辑*](#3. char 逐字节输出逻辑*)

第三篇:重难点辨析|整型变量与字符数组字节序差异

一、对照实验代码

二、实验可视化解析(极简无冗余)

[实验 1:int 强转 char* | 观测 Store 写入](#实验 1:int 强转 char* | 观测 Store 写入)

[实验 2:char 数组强转 int* | 观测 Load 读取](#实验 2:char 数组强转 int* | 观测 Load 读取)

三、核心对比总结

全文终极结论


第一篇:字节序本质|CPU、寄存器、存储器核心关系

一、核心硬件分工

字节序由 CPU、寄存器、存储器三者的数据交互机制决定,核心硬件分工如下:

• 寄存器(CPU 内部):唯一运算区域,存储临时数据。数据拥有「高字节、低字节」数值层级,无内存地址概念。

• 存储器(内存):数据持久存储区域。仅存在「低地址、高地址」地址顺序,无数值字节层级概念。

• CPU:负责数据搬运,包含 Load(内存→寄存器)、Store(寄存器→内存),字节序为 CPU 硬件固化规则。

二、字节序诞生原理

固定硬件搬运逻辑:运算只能在寄存器执行,持久数据只能存放在内存。

• 运算前:内存 ➜ 寄存器(Load 读取拼装)

• 运算后:寄存器 ➜ 内存(Store 拆解写入)

核心冲突(字节序唯一来源)

• 寄存器:按字节高低逻辑排布

• 内存:按地址高低物理排布

多字节数据在寄存器与内存相互搬运时,字节映射规则不同,衍生出大小端模式。

三、大小端可视化定义

• 小端(主流架构:x86/ARM):内存低地址 存放 寄存器低字节

• 大端(网络协议 / 嵌入式):内存低地址 存放 寄存器高字节

注:单字节 char 类型无字节序概念,仅多字节复合数据存在字节序差异。

第二篇:核心代码验证|存储逻辑与 printf 输出机制

一、验证代码

cs 复制代码
#include <stdio.h>
int main()
{
    int a = 0x11223344;
    printf("%x\n",a);  

    // 逐字节读取内存原始数据
    char *p = (char*)&a;
    printf("%x %x %x %x\n",*p,*(p+1),*(p+2),*(p+3));  

    return 0;
}

二、小端环境标准输出

  • 整型输出:11223344
  • 逐字节输出:44 33 22 11

三、核心逻辑解析

1. 数据 Store 存储逻辑

int a = 0x11223344 在寄存器逻辑排布:11(高字节) 22 33 44(低字节)

小端 CPU 写入规则:低位字节存入内存低地址

内存物理排布(低地址→高地址):44 33 22 11

2. int 整型 printf 输出逻辑

读取整型变量时,CPU 自动将内存离散字节,按本机字节序重组为完整逻辑整数。

printf 固定按照「高字节在前、低字节在后」的数值规范输出,完全屏蔽内存物理排布。

3. char 逐字节输出逻辑*

char* 改变内存访问粒度,关闭 CPU 自动拼装功能。

直接按内存低地址→高地址遍历原始字节,输出内存真实存储状态。

第三篇:重难点辨析|整型变量与字符数组字节序差异

一、对照实验代码

cs 复制代码
#include <stdio.h>
int main()
{
    // 实验1:验证CPU Store 写入拆解规则
    int a = 0x11223344;
    char *p = (char*)&a;
    printf("%x %x %x %x\n",*p,*(p+1),*(p+2),*(p+3)); 

    // 实验2:验证CPU Load 读取拼装规则
    char buf[4] = {0x01,0x02,0x03,0x04};
    int *pi = (int *)buf;
    printf("%x\n",*pi);  

    return 0;
}

二、实验可视化解析(极简无冗余)

实验 1:int 强转 char* | 观测 Store 写入

场景:完整整数 → CPU 拆解字节 → 写入内存

  1. 寄存器逻辑:高字节 11 22 33 44 低字节

  2. 小端写入规则:内存低地址 ⬅ 寄存器低字节

  3. 内存物理排布:低地址 44332211 高地址

输出结果:44 33 22 11

实验 2:char 数组强转 int* | 观测 Load 读取

场景:内存零散字节 → CPU 按规则拼装为完整整数

1. 数组内存固定排布 (与字节序无关):低地址 01020304 高地址

2. 小端读取规则:

  • 内存低地址 ➜ 整型低位
  • 内存高地址 ➜ 整型高位

3. 字节精准映射关系

  • 内存地址递增: 01 (低地址) 02 03 04 (高地址)
  • 对应整型位阶: 低位 次低位 次高位 高位
  • 映射结果:01(低位) 02(次低位) 03(次高位) 04(高位)
  • 拼装数值:0x04030201
  • 输出结果:4030201

三、核心对比总结

  1. int→char*:测试 Store 写入,整数拆解适配内存字节序

  2. char 数组→int*:测试 Load 读取,内存字节拼装适配 CPU 字节序

全文终极结论

  1. 字节序是CPU 硬件特性,内存、数组仅为存储载体,无字节序属性;
  2. printf 打印 int 是逻辑数值(高字节优先),char* 遍历是物理内存(低地址优先);
  3. 数组内存顺序由代码定义,固定不变;
  4. Store 负责整数拆解写入,Load 负责字节拼装读取。
相关推荐
女神下凡1 天前
嵌入式设计的各种存储芯片的硬件/软件设计规范,非常全面。
arm开发·单片机·嵌入式硬件
从零开始的嵌入式之旅1 天前
day47
arm开发·经验分享·笔记·嵌入式硬件
老当益壮梁奶奶1 天前
ARM汇编学习笔记(六):【i.MX6ULL】时钟系统与定时器(EPIT & GPT)
c语言·arm开发·嵌入式硬件·学习·51单片机
昌原的儿子LEO1 天前
IMX6ULL 时钟系统与 EPIT/GPT 定时器原理与配置
arm开发·学习
sunoo-2291 天前
【ARM嵌入式学习笔记Day6】一文打通i.MX6ULL时钟体系:PLL/PFD/预分频+滞回比较器全解析
arm开发·笔记·vscode·单片机·imx6ull·汇编语言
M78佐菲2 天前
ARM学习笔记(1)
linux·arm开发·笔记·嵌入式硬件·学习
sunoo-2292 天前
【嵌入式裸机开发Day04】i.MX6ULL 蜂鸣器驱动详解:从引脚地址查找到代码实现全流程
arm开发·单片机·嵌入式硬件·学习·串口·裸机
Doraemomo2 天前
IMX6ULL裸机开发——PWM
arm开发·嵌入式硬件·imx6ull
老当益壮梁奶奶2 天前
ARM汇编学习笔记(五):从按键轮询到 GIC 中断控制器(ARM Cortex-A7 )
arm开发·笔记·单片机·嵌入式硬件
M78佐菲2 天前
ARM学习笔记(五)
linux·arm开发·笔记·嵌入式硬件·学习