深入理解整数补码与IEEE 754浮点数:内存到精度踩坑指南
先说个有点丢人的事好几年之前我做支付模块联调对账发现金额偶尔差几分钱第一反应是数据库字段精度配错了改来改去都白忙活。后来查了半天问题出在代码里有人把金额塞进了float存进去再读出来已经“变了形”。从那次以后我就把整数和浮点数在内存里的真实样子彻底啃了一遍。说真的你只要理解了“数字在内存里的二进制布局”很多诡异 bug 不用猜就能定位。这篇我打算从整数聊到浮点数重点拆开发问号最多的三件事补码为什么是这个鬼样子、IEEE 754 的指数和尾数怎么配合、以及浮点精度问题到底卡在哪里。最后还会带一点实操直接在内存里把数字的原始字节拉出来看看完了基本就忘不掉了。适合刚学编程但总在类型上报错的人也适合写了好几年代码想把这个基础补扎实的同行。1. 整数在内存里是怎么摆的1.1 先看结果正整数在内存里长什么样先把最日常的情况说清楚。在绝大多数平台里int是 32 位也就是 4 个字节。你把一个整数放进去比如1它在内存里的二进制其实长这样00000000 00000000 00000000 00000001这就是你大脑里能想到的“二进制数”没有任何特殊处理。258呢256 2二进制是1 0000 0010补齐到 32 位就是00000000 00000000 00000001 00000010所以正整数存储没什么悬念人人都能算对。但事情一到负数就开始离谱了。为什么-1不是简单地“把最高位改成 1”就完事为什么 8 位有符号整数里-128写出来是10000000这就要说到原码、反码、补码的演化过程。1.2 原码反码补码三条路里为什么选中补码原码是人类最直观的设计最高位当符号位0 代表正、1 代表负剩下位存绝对值。5就是00000101-5就是10000101。这方案有一眼可见的问题两个零00000000和10000000分别代表正零和负零机器做相等判断时要特判更麻烦的是加减法电路没法统一计算5 (-3)时不能直接拿两者的原码做加法否则得到10001000也就是-8完全不对。于是有了反码负数保持符号位不变其余位全部取反。-5变成11111010。这样5 (-3)在原码反码混合运算时就好了一些但仍有负零问题。最后是补码负数在反码基础上再加 1。-5就是11111011。补码解决了两个核心问题上。第一个是零的唯一性。8 位下补码的 0 只可能是00000000因为11111111 1溢出后结果是00000000截断到 8 位负零不存在了。第二个是加减法完全统一。你只需要一个加法器减法转成“加上减数的补码”就行。5 (-3)等于00000101 11111101结果是100000010截断掉最前面的进位得到00000010就是 2。进位丢了不是出错而是恰好利用了模运算在一个 8 位容器里任何多出的高位都被丢弃等价于自动对 256 取模。这跟钟表上“9 点再转 12 个小时回到 9 点”是一个道理一圈转完自动归零。因为这个原因补码成了几乎所有 CPU 处理有符号整数的事实标准。你在 Java 里写System.out.println(Integer.toBinaryString(-1))得到的是 32 个 1这不是奇闻异事是补码的正常表现。1.3 有符号和无符号的边界溢出不是 bug 是特性理解了补码之后再看那些经典的溢出问题就非常透明了。8 位有符号整数的范围是-128到127。127 1在二进制里是怎么走的01111111 00000001 1000000010000000这个数你单独看它既不是正数的128也不是常规逻辑下的0。按照补码的解释它就是-128因为它等于-128 0。所以byte类型从127加一变成-128一点没违反规则只是人类看着别扭。这背后还有个容易被忽略的点溢出不会报错。你把一个int加到超过边界JVM 不会突然抛异常C 里也不会结果就是数字直接绕回。常见的业务 bug 比如“订单号自增到 21 亿后突然变负数”原因就在这里。所以写代码时不是“等到溢出再说”而是提前估算范围选择long、long long甚至任意精度大整数类型。无符号整数的处理就更直接了它把符号位也当作数值位来用。8 位无符号能表示0到255255 1回到0。这类类型在网络协议、控制芯片里非常常见但在 Java 里原生缺位导致很多人在做嵌入式或协议解析时还得手动模拟无符号运算。注意Java 里没有无符号byte可字节本来就只有 8 位你如果想把它当无符号看需要做b 0xFF这样的掩码操作。这个习惯我建议从一开始就养成以后解析二进制数据能省很多事。1.4 大小端字节序内存看的顺序和你想的相反如果你直接读内存文件或者用调试器看变量的字节会发现一个奇怪现象在某些机器上整数1的 4 个字节显示为01 00 00 00而不是00 00 00 01。这涉及字节序问题。小端字节序Little-Endian把“最低有效字节”放在内存的低地址x86 和绝大多数 ARM 处理器默认都是这种。1的最低位字节是0x01所以它在低地址那格先出现。大端字节序Big-Endian则把“最高有效字节”放低地址人类读的时候是自然的00 00 00 01。网络传输协议里规定的是大端所以你写 socket 通信往报文里塞数字时如果直接拿本机的小端内存去发包对端读出来就是错的。解决办法不是手动翻转而是调用htonl、htons这类函数或者明确用 Java 的ByteBuffer指定BIG_ENDIAN。字节序本身没有优劣只是设计取舍。但你要排查类似“读 WAV 文件头时采样点数不对”这类问题的时候脑子里条件反射先问一句“文件头字节序是什么”通常立刻能找到答案。2. 浮点数的存储科学计数法的二进制亲戚2.1 浮点数的大结构一个符号位一群指数一队尾数整数讲完了终于到了浮点数。很多人在学校学过float占 4 字节、double占 8 字节但 4 字节里到底怎么存一个3.14能说清楚的人不多。浮点数的存储标准现在基本统一为 IEEE 754。以 32 位float为例它把内存这样拆第 1 位符号位 S0 正 1 负接下来 8 位指数位 E存储指数加偏移量剩下 23 位尾数位 M存储小数部分64 位double则是 1 位符号、11 位指数、52 位尾数。这个布局很像十进制科学计数法3.14 × 10^2里3.14是有效数字2是指数。二进制里就是(-1)^S × (1.M) × 2^(E-offset)。“偏移量”是什么你能想到指数不能直接存负数因为寄存器里没有单独的“指数符号位”。所以设计者把实际指数映射成一个正整数。单精度的偏移量是 127也就是说存储值 E 减去 127 等于实际指数。比如实际指数是 0E 就存 127实际指数是 3E 就存 130。尾数的细节更有意思规格化数要求小数点前只能有一位非零数字二进制里就是只能有1。既然第一位永远是 1设计者干脆不存这一位只存后面的小数位白赚了一位精度。这就是传说中的“隐藏位”。2.2 十进制小数转二进制你会缝整数也会缝分数十进制小数转二进制小数和整数转二进制类似只是换成乘 2 取整。拿0.375举例0.375 × 2 0.75 - 取整数 0 0.75 × 2 1.5 - 取整数 1 0.5 × 2 1.0 - 取整数 1结果是0.011正好等于 0.25 0.125。这个转换过程是有限的所以0.375能精确表示。但换成0.1立马出问题0.1 × 2 0.2取 00.2 × 2 0.4取 00.4 × 2 0.8取 00.8 × 2 1.6取 1再继续……你会发现这个序列永远循环下去0.1变成二进制是无限循环小数0.00011001100110011001100110011...一台计算机的内存是有限的23 位尾数只装得下前面一小截后面的循环只能截断或舍入。所以0.1在float里存的是一个非常接近但不等于 0.1 的数。这不是某个编译器的问题是所有二进制浮点数都逃不掉的事实。2.3 规格化、指数偏移和特殊值为什么指数位是 8 不是 9规格化浮点数的准确定义是尾数范围在[1, 2)之间隐藏位为 1。这样数值范围才可以尽量拉大。单精度因为指数部分有 8 位存储值 E 的范围是 0 到 255去掉偏移 127实际指数范围在-126到127之间0 和 255 另有用途。加上尾数精度单精度能表示大约1.18×10^-38到3.4×10^38的数。那两个保留的指数值拿来干嘛一个是全 0 指数表示非规格化数尾数隐藏位变为 0用来表示接近零的极小值避免出现 gap另一个是全 1 指数用来表示无穷大和 NaN。具体地说指数全 1、尾数全 0表示正无穷或负无穷符号位决定方向指数全 1、尾数非全 0表示 NaN一个“不是数字”的结果指数全 0、尾数不全 0非规格化数指数全 0、尾数全 0表示真正的 0你平时写代码时1.0 / 0.0不会崩而是得到一个Infinity0.0 / 0.0得到NaN就是因为这几个特殊值被设计进去了。常见坑Java 里float / 0能跑出Infinity但整数int / 0直接抛ArithmeticException。这个差异特别容易在混用整数和浮点数时踩中。顺带说下为什么指数位不是越多越好。指数位越多能表示的数值范围就越大但尾数位会被挤占精度下降。这就是float与double的平衡取舍单精度指数 8 位、尾数 23 位双精度指数 11 位、尾数 52 位后者范围和精度都强出一大截。2.4 浮点数转回十进制反过来算一遍理解了这三段结构你可以从内存字节反推出十进制数值。比如一个float的二进制位是0 10000000 00000000000000000000000符号位 0指数存储值 128减去偏移 127 得到实际指数 1尾数位全 0隐藏位是 1所以数值是1.0 × 2^1 2.0。这个结果对应的是float f 2.0f。如果二进制位是0 10000000 10000000000000000000000尾数部分二进制0.1代表0.5所以数值是1.5 × 2^1 3.0。这也解释了为什么程序员面试时经常看到3.0f的十六进制是0x40400000因为这个数的二进制本身就是按上面的规则排出来的。你可能奇怪为什么0.1这种十进制里的小数转成二进制后内存字节看上去像一串乱码。这串乱码恰恰是它在二进制体系里的“精确近似”。看一次这个转换过程你对浮点数精度问题就会建立起实感。3. 精度、比较和转换全是踩坑重灾区3.1 为什么 0.1 0.2 不等于 0.3网上经典问题Python、Java、JavaScript、C 都会生出一个幽灵值0.1 0.2的结果不是0.3而是后面的小数位多了一点“脏数据”。原因现在很明确了0.1和0.2在二进制里都是无限循环小数转成浮点数后已经各自产生了舍入误差。两个有误差的数相加误差被继续放大最后的结果和“把 0.3 转成浮点数”得到的结果对不上。你可以做个简单实验用 Python 看精确值 format(0.1, .60f) 0.10000000000000000555111512312578270211815834045410156250 format(0.3, .60f) 0.2999999999999999888977697537484355952885150918273925781250看到没0.3 本身也不是干干净净的 0.3它存的是最接近 0.3 的那个二进制浮点数而这个数实际略小于 0.3。0.1 0.2的结果又恰好略大于 0.3所以两者天然不相等。3.2 比较浮点数的正确姿势知道原因之后任何直接用比较浮点数的代码都应该过一遍脑子。两个浮点数在数学上相等但在内存里可能是两个往返舍入后的不同副本。比较策略一般有这么几种第一种绝对误差法。计算差的绝对值只要小于某个阈值就算相等。阈值选多少取决于你的业务量级比如计时器精度到纳秒级可以选1e-9金额级别建议直接不要用浮点。第二种相对误差法。对跨越多个数量级的数单纯用绝对误差不靠谱1e-10和1e10的数量差异会误导。这时候需要按比例计算误差abs(a - b) epsilon * max(abs(a), abs(b))。第三种终极稳妥方法别用二进制浮点数做需要精确相等的运算。金额、库存、评分这类要求精确的小数业界惯例是使用十进制十进制类JavaBigDecimal、定点整数金额用“分”为单位存整数或者其他十进制表示方案。经验分享我在做电商类项目时对金额的规则是数据库用一个整数存分服务端运算也全部用长整数只有展示给用户时才除以 100。这招彻底绕开了浮点精度陷阱审计对账从来不用纠结小数点尾巴。3.3 整数和浮点互相转换丢了的不只有小数位类型转换带来的问题比精度比较更隐蔽。把int转成float时大整数可能被“四舍五入”成另一个数。float尾数部分加上隐藏位一共只有 24 位有效精度这意味着超过2^24 16777216的整数不能保证全覆盖。16777217这个数转成float后很可能会变成16777216.0。你拿它去做金额计算再转回整数钱就悄悄少了一块钱。把float转成int更危险。C/C 里如果浮点数值超出int能表示的范围结果是未定义行为Java 里 Java 强制截断超出范围时直接变成Integer.MAX_VALUE或者Integer.MIN_VALUE但你大概率不会得到你想要的数。就算没超出范围3.99转int也会直接变成3不是四舍五入。这里给你们一个实用建议做转换前先检查和比较范围再考虑小数处理方式。double d 3.99; if (d Integer.MIN_VALUE d Integer.MAX_VALUE) { int i (int) d; // 得到 3如果业务要四舍五入先用 Math.round() } else { // 处理溢出情况 }3.4 NaN 的特殊性它不等于任何数包括它自己写浮点比较时还有个反直觉特性NaN ! NaN。你用if (x x)判断是不是 NaN 都能成立。Java 里你得用Float.isNaN(x)或Double.isNaN(x)C/C 里也得用专门的isnan函数不能靠比较搞定。这个坑在解析外部数据时特别常见。比如某接口返回了一个“NaN”字符串你转成double后拿去做排序排序算法的比较回调会返回不一致结果严重的会导致数组排序后缺失元素或抛异常。注意Double.compare(Double.NaN, 0.0)在 Java 里返回的是 1所以用排序和比较器时要清楚 NaN 的定位。这种底层特性不是崩溃直接报错而是以更隐蔽的“逻辑看起来对、结果总不对”的形式出现。4. 实操直接在内存里抓出这些数字4.1 C 语言逐字节打印内存理论讲再多不如亲眼看一下字节。用 C 把变量的内存地址当unsigned char*逐字节打印能直接把大小端、补码、浮点布局都暴露在眼前。#include stdio.h void dump(const void *addr, size_t len) { const unsigned char *p (const unsigned char *)addr; for (size_t i 0; i len; i) { printf(%02x , p[i]); } putchar(\n); } int main() { int a 1; float f 1.0f; double d 0.1; printf(int a1 : ); dump(a, sizeof(a)); printf(float f1.0: ); dump(f, sizeof(f)); printf(double d0.1: ); dump(d, sizeof(d)); return 0; }在 x86 小端机器上你会看到int a1 : 01 00 00 00 float f1.0: 00 00 80 3f double d0.1: 9a 99 99 99 99 99 b9 3ffloat 1.0的字节00 00 80 3f大端视角读回去就是3f 80 00 00正好是符号位 0、指数位 127偏移后、尾数全 0对应二进制布局。double 0.1的字节乱成一团但每一字节都是 0.1 这个无限循环二进制在 52 位尾数里的具体投影。看完这一幕你心里对“浮点数不是十进制数”这件事应该就彻底有数了。4.2 用 Python 解剖浮点数的位模式没有 C 环境的话Python 的struct模块也能干同样的事而且更优雅import struct bits struct.unpack(I, struct.pack(f, 1.0))[0] print(hex(bits)) # 0x3f800000 print(bin(bits)) # 0b111111100000000000000000000000 bits64 struct.unpack(Q, struct.pack(d, 0.1))[0] print(hex(bits64)) # 0x3fb999999999999a这里的0x3f800000就是你经常在各种文档里看到的1.0f的十六进制值。把0.1的双精度位0x3fb999999999999a拆开符号位 0指数部分0x3fb减偏移1023得到-4尾数部分的999999999999a排列出来后正好对应二进制近似值1.1001100110011001100110011001100110011001100110011010 × 2^-4。误差这一下就具象了。4.3 调试器和手工断点看变量不如看内存如果你日常用 IDE 或 GDB直接在断点处查看内存往往比相信调试器的变量展示更可信因为调试器会帮你做“人类友好展示”偶尔会掩盖真实内存状态。GDB 里看一个int a的 4 个字节(gdb) x/4bx a 0x7fffffffe1ac: 01 00 00 00x/4bx表示以十六进制显示从地址开始的 4 个单字节。再看float f(gdb) x/4bx f 0x7fffffffe1b0: 00 00 80 3f如果你想知道当前机器是大端还是小端一个非常笨但有效的方法是把a1的四个字节记下来看低地址第一个字节是不是01。是就是小端不是就是大端。同样原理你在分析二进制文件时遇到魔数不对、长度字段对不上可以用十六进制编辑器打开文件和结构体定义逐字节对照通常一眼就能定位到是字节序问题还是字段偏移算错了。4.4 常见问题排查速查表直接给一份我整理过的速查表遇到症状照着查。现象可能原因处理思路整数加到一半突然变成负数有符号整数溢出符号位被进位顶掉换更大的整数类型或加溢出检测读网络协议/二进制文件时数字对不上字节序不符通常本机小端协议大端用htonl/ntohl或明确指定字节序解析金额计算偶尔差几分用float/double存金额改用分单位整数或十进制类0.1 0.2 ! 0.3二进制浮点舍入误差使用epsilon比较或避免浮点精确比较if (x ! x)居然为 truex是 NaN用isnan判断而非比较大整数转float后变小/变乱超过 24 位二进制精度发生舍入检查数值是否超过 16777216必要时换double浮点转整数结果不对截断而非四舍五入或超出整数范围先判断范围需要四舍五入时显式调用round负数右移结果不是除以 2有符号数右移是算术右移高位补符号位无符号或用除以 2 的写法极小的正数算出 0浮点下溢低于最小非规格化数检查数值范围选用long double或定点表示这张表不能替代所有排查但能覆盖我这些年实际遇到的大多数“数字突然不对”的场景。再补充一个我踩过多次的细节Java 的Integer.toBinaryString(-1)返回的是 32 个 1而Integer.toHexString(-1)返回ffffffff。如果你在工作中看到这两个输出不要再说是“Java 坏了”它就是补码的本来面貌。理解了补码以后这类输出你会觉得理所当然甚至能因此识别出很多基于“觉得 Java 存储有问题”的谣言帖。平时多花点时间把内存布局这类底层知识夯实写上层业务时才能更稳。我到现在还保持着看二进制文件、看内存字节的习惯不为别的就是排查问题时脑子里多一张“底层地图”。把整数和浮点数在内存里的样子当成工具箱里最基础的一件工具越是刁钻的 bug越能看出它的价值。

相关新闻

MySQL数据类型选型实战:从TINYINT到JSON避坑指南

MySQL数据类型选型实战:从TINYINT到JSON避坑指南

很多人学MySQL,建表、查询、索引都能说得头头是道,但一到数据类型就容易翻车:金额用FLOAT算、手机号存成数值类型、日期存成字符串导致排序列炸。我这些年排查线上事故,发现相当一部分性能问题和数据异常,追到根上都是…

2026/10/9 8:50:34 阅读更多 →
离散型制造数字工厂蓝图:五层架构与场景应用规划实战

离散型制造数字工厂蓝图:五层架构与场景应用规划实战

最近半年,陆续有几位制造企业的信息化负责人都拿同一个需求来找我:帮着理一版“十五五”期间离散型智能制造数字工厂的建设蓝图架构和场景应用规划。说实话,这类题目看起来宏大,落下去却最容易变成“PPT建厂”。离散制造本身多品种…

2026/10/10 11:34:21 阅读更多 →
OpenClaw深度解析:从本地模型调度到ROS2机器人实战

OpenClaw深度解析:从本地模型调度到ROS2机器人实战

最近这阵子,OpenClaw 这个词在开发者社区出现的频率高得离谱。早上刚刷到一篇“我把 OpenClaw 装进了安卓手机”的教程,下午又看到有人用它挂在 ROS2 上指挥 Gazebo 里的机器人,到了晚上还有人拿它和各个 AI 编程插件对比,吵得不可…

2026/10/9 10:34:21 阅读更多 →

最新新闻

饿汉式单例模式全解析:线程安全、反射防御与实际选型

饿汉式单例模式全解析:线程安全、反射防御与实际选型

1. 从第一次写单例说起:为什么我们非要一个"唯一实例"如果你工作过一两年,大概率见过类似的东西:一个ConfigManager、一个DataCache、一个ThreadPoolHolder,几乎所有项目里都有这种"全局只应该有一个人干活"的…

2026/10/10 12:10:45 阅读更多 →
MySQL访问个人学习笔记

MySQL访问个人学习笔记

一、MySQL访问的本质在前面几篇博客中已完成了数据库的基本使用和原理相关学习和梳理,本篇介绍如何使用语言连接MySQL。已知MySQL有客户端和服务端,程序员要做的就是编写业务逻辑,将需求发给客户端,客户端进而访问服务端&#xff…

2026/10/10 12:10:45 阅读更多 →
Day85-全链路压测体系搭建:从JMeter到生产压测平台

Day85-全链路压测体系搭建:从JMeter到生产压测平台

上篇回顾:Day 84 用 Arthas 在不重启 JVM 的情况下五分钟定位生产故障、热修复走紧急发布。但单点诊断解决的是"某个接口为什么慢",压测要解决的是"整条链路在什么量会崩"。这篇给你真正生产可用的全链路压测体系。单接口压测最大的…

2026/10/10 12:10:45 阅读更多 →
PID三作用详解与整定口诀:一张图看懂比例、积分、微分

PID三作用详解与整定口诀:一张图看懂比例、积分、微分

做自动化这些年,PID 绝对是绕不开的一道坎。不管是调温、调压、调流量,还是转速、位置、浓度控制,翻开控制器参数列表,八成又是“Pxxx, Ixxx, Dxxx”。刚入行的时候我也死记硬背过公式,被整定口诀搞得云里雾里&#xf…

2026/10/10 12:10:44 阅读更多 →
基于PJ85718DM与STM32F413RH的多点温度监测系统设计与实现

基于PJ85718DM与STM32F413RH的多点温度监测系统设计与实现

1. 项目背景与核心需求拆解温度监测这件事,看起来简单,真要做到"本地准、远程稳、长期不飘",里面的门道比想象中多得多。我这次做的项目,核心就是用一颗PJ85718DM温度传感芯片配合STM32F413RH主控,搭一套能同…

2026/10/10 12:10:44 阅读更多 →
短剧工作室降本方案,知漫剧一站式出片流程

短剧工作室降本方案,知漫剧一站式出片流程

短剧工作室降本,砍的不该是人,是链路。本次评测的知漫剧(zz.jiaxunai.cn)把分镜、画面、配音、字幕、合成五步串成一键流水线,站内闭环不导文件,批量导出按集数自动归档命名,单集出片约 30 分钟…

2026/10/10 12:09:44 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →