news 2025/12/27 15:15:07

字节,字,半字

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
字节,字,半字

在计算机体系结构和嵌入式开发(如 ESP32、ARM、x86 等)中,“字”“半字”“字节”的大小不是固定值,而是依赖于具体处理器架构。以下是通用定义及常见平台对照:


标准定义(基于处理器字长)

术语含义大小(以“字节”为单位)
字节(Byte)最小可寻址单位1 字节 = 8 位(bit)(几乎所有现代系统)
半字(Half-word)字的一半2 字节 = 16 位
字(Word)处理器的自然数据宽度4 字节 = 32 位(在 32 位系统中)
8 字节 = 64 位(在 64 位系统中)

📌关键原则

  • 字节(Byte)始终是 8 位(自 1960 年代 IBM System/360 起成为行业标准)。
  • “字”的大小 = CPU 寄存器宽度 = 地址总线粒度

🔍常见平台对照表

平台 / 架构字节(Byte)半字(Half-word)字(Word)双字(Double-word)
ESP32 / ESP32-S3
(Xtensa LX6, 32位)
1 字节 (8 bit)2 字节 (16 bit)4 字节 (32 bit)8 字节 (64 bit)
ARM Cortex-M
(如 STM32, 32位)
1 字节2 字节4 字节8 字节
x86-64
(PC 64位)
1 字节2 字节8 字节(注意!)16 字节
RISC-V 32位1 字节2 字节4 字节8 字节
传统 16 位单片机
(如 8051)
1 字节2 字节

⚠️特别注意 x86-64
虽然寄存器是 64 位,但为兼容历史,“word” 仍常指 16 位,而“long word” = 32 位,“quad word” = 64 位。但在 Linux/POSIX 中,sizeof(int)= 4 字节,sizeof(long)= 8 字节。


💡在 ESP32-S3(Xtensa 32位架构)中的实际大小

ESP32-S3 是32 位处理器,因此:

  • 1 字节(Byte)=8 位uint8_t
  • 半字(Half-word)=2 字节 = 16 位uint16_t
  • 字(Word)=4 字节 = 32 位uint32_t
  • 双字(Double-word)=8 字节 = 64 位uint64_t

验证代码(ESP-IDF)

#include <stdio.h> #include <stdint.h> void check_sizes() { printf("sizeof(uint8_t) = %d bytes\n", sizeof(uint8_t)); // 1 printf("sizeof(uint16_t) = %d bytes\n", sizeof(uint16_t)); // 2 printf("sizeof(uint32_t) = %d bytes\n", sizeof(uint32_t)); // 4 printf("sizeof(void*) = %d bytes\n", sizeof(void*)); // 4 (32位指针) }

输出

sizeof(uint8_t) = 1 bytes sizeof(uint16_t) = 2 bytes sizeof(uint32_t) = 4 bytes sizeof(void*) = 4 bytes

📚为什么会有“字长”概念?

  • 历史原因:早期计算机字长各异(PDP-11 是 16 位,VAX 是 32 位)。
  • 性能优化:CPU 对“字”大小的数据读写最快(对齐访问)。
  • 内存对齐:结构体中int(字)通常按 4 字节对齐。

⚠️常见误区

误区正确理解
“字一定是 2 字节”错!在 32/64 位系统中,字是 4/8 字节
“半字就是半个字节”错!半字 = 2 字节,半字节 = 4 位(nibble)
“所有平台字长相同”错!必须查具体 CPU 手册

一句话总结

ESP32-S3(32位)上:

  • 字节 = 1 字节
  • 半字 = 2 字节
  • 字 = 4 字节

记住:字长 = CPU 位数 ÷ 8(32位 → 4字节,64位 → 8字节),字节永远是 1 字节

freadC语言标准库中用于从文件流(文件指针)中读取数据的函数,属于stdio.h头文件。它的核心作用是按指定大小和数量读取二进制数据,而非按字符串解析。


🔍fread 的核心语法

size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
参数说明
ptr指向目标缓冲区的指针(数据将存入此内存)
size每个数据块的大小(字节单位,如sizeof(int)
count要读取的数据块数量
stream文件指针(通过fopen获取)
返回值实际读取的数据块数量(0~count

💡关键点
fread读取的是原始二进制数据,不进行任何格式转换(如scanf会解析字符串)。


使用示例(代码级解析)

场景:从文件读取 10 个int类型数据
#include <stdio.h> int main() { FILE *fp = fopen("data.bin", "rb"); // 以二进制模式打开文件 if (!fp) { perror("文件打开失败"); return 1; } int values[10]; // 目标缓冲区(10个int) size_t num_read = fread(values, sizeof(int), 10, fp); // 读10个int printf("成功读取 %zu 个数据\n", num_read); // 输出:10(若文件有10个int) fclose(fp); return 0; }

⚠️必须注意的坑(新手易错)

问题原因解决方案
fread返回 0文件为空/未打开/读取超限检查fopen是否成功 + 文件大小
数据乱码fread读取了文本文件(如txt二进制文件才用fread!文本用fgets/fscanf
读取大小错误size写成sizeof(char)而非sizeof(目标类型)例:fread(arr, sizeof(int), 10, fp)
未检查返回值读取失败时继续使用ptr必须检查num_read != count

💡安全写法

if (fread(values, sizeof(int), 10, fp) != 10) { fprintf(stderr, "读取失败! 实际读取: %zu\n", num_read); // 处理错误 }

🌟为什么用fread而不是fscanf

函数适用场景例子
fread二进制文件(如图像、音频、传感器数据)读取data.bin中的int/float
fscanf文本文件(字符串格式化解析)读取config.txt中的name=John

嵌入式场景
ESP32 读取 SD 卡上的传感器原始数据(如MPU6050的 6 个轴数据),必须用fread


💡ESP32-S3 实战案例

从 SD 卡读取 100 个浮点数(传感器数据)
#include "esp_vfs_fat.h" #include "sdmmc_host.h" void read_sensor_data() { // 1. 挂载 SD 卡(省略挂载代码) FILE *fp = fopen("/sdcard/sensor_data.bin", "rb"); if (!fp) { printf("文件打开失败\n"); return; } float data[100]; // 存储100个浮点数 size_t num_read = fread(data, sizeof(float), 100, fp); if (num_read != 100) { printf("读取失败! 实际: %zu\n", num_read); } else { printf("成功读取100个浮点数\n"); // 处理数据(如发送到云端) } fclose(fp); }

📊 **freadfwrite对比(文件操作黄金组合)

函数作用逆操作
fread从文件二进制数据 → 内存fwrite(内存 → 文件)
fwrite从内存二进制数据 → 文件fread(文件 → 内存)

典型流程

// 写入(保存数据) fwrite(data, sizeof(float), 100, fp); // 读取(恢复数据) fread(data, sizeof(float), 100, fp);

常见问题解答

Q1:fread读取的字节数 =size * count吗?

是的
例:fread(ptr, 4, 5, fp)会读取4 * 5 = 20字节。

Q2: 为什么文件必须用rb模式打开?

⚠️文本模式r会转换换行符(\n\r\n,导致二进制数据损坏。
必须用rb(二进制模式)

Q3:fread会自动处理文件指针位置吗?

!每次fread后,文件指针自动后移size * count字节。


一句话总结

fread= 二进制文件读取的“标准武器”
用法:fread(目标缓冲区, 每块大小, 块数, 文件指针)
关键:文件必须用rb模式打开,且必须检查返回值!

💬真实场景
在 ESP32 上读取 SD 卡存储的 1000 个温度传感器数据(float类型),用fread1 行代码搞定,比fscanf快 10 倍!

💡避坑口诀
“二进制文件用fread,文本文件用fscanf,打开模式rb,返回值必检查!”

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/17 7:37:47

AI学会理解物理法则:OpenAI Sora 2如何重塑视频生成新范式

欢迎来到小灰灰的博客空间&#xff01;Weclome you&#xff01; 博客主页&#xff1a;IT小灰灰 爱发电&#xff1a;小灰灰的爱发电 热爱领域&#xff1a;前端&#xff08;HTML&#xff09;、后端&#xff08;PHP&#xff09;、人工智能、云服务 目录 一、物理引擎的"顿悟…

作者头像 李华
网站建设 2025/12/12 22:35:55

全连接层(Fully Connected Layer)

全连接层&#xff08;Fully Connected Layer&#xff0c;又称稠密层/Dense Layer&#xff09;是神经网络中最基础且重要的组件之一&#xff0c;广泛应用于多层感知机&#xff08;MLP&#xff09;、卷积神经网络&#xff08;CNN&#xff09;和Transformer等架构中。以下是对全连…

作者头像 李华
网站建设 2025/12/12 22:35:49

一文讲透布隆过滤器实现原理及应用场景总结

布隆过滤器的工作原理布隆过滤器的工作原理基于三个核心要素&#xff1a;1. 一个大的位数组&#xff08;Bit Array&#xff09;这是布隆过滤器的存储主体。它是一个长度为 m 的数组&#xff0c;每个位置只存储一个比特&#xff08;0或1&#xff09;。初始时&#xff0c;所有位都…

作者头像 李华
网站建设 2025/12/20 7:39:41

理性抉择方可行远——企业AI转型的路径选择与风险管控

数字化浪潮下&#xff0c;AI转型已成为企业提升核心竞争力的必答题。然而现实中&#xff0c;不少企业陷入“转型即烧钱”“技术即万能”的误区&#xff1a;传统制造企业盲目自研大模型&#xff0c;耗费数百万后无功而返&#xff1b;互联网公司一味追求API集成便捷性&#xff0c…

作者头像 李华
网站建设 2025/12/12 22:29:12

C51_74HC595串口转并口

文章目录一、74HC595   1、芯片引脚   2、内部框图   3、时序操作二、单芯片工模式   1、原理图   2、驱动代码     1&#xff09;、74hc595.h     2&#xff09;、74hc595.c     3&#xff09;、mian.c三、级联工作模式   1、原理图   2、驱动代码 …

作者头像 李华
网站建设 2025/12/16 21:18:39

C51_HC-SR04超声波模块

文章目录一、HC-SR04   1、电气参数   2、引脚二、HC-SR04工作原理   1、基本工作原理   2、超声波时序图   3、原理图三、代码实例   1、UT.h   2、UT.c   3、main.c   4、实例现象一、HC-SR04 HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功…

作者头像 李华