类型转换精度丢:int 转 float 截断,先转宽类型再算
摘要:本文通过一个 ADC 标度换算翻车案例,讲解 C 语言中 int/int 整数除法截断导致的精度丢失问题。核心原因:两个整数相除结果仍是整数,小数在整数阶段已被丢弃,再赋给 float 为时已晚。解法是在运算前把操作数转成浮点((float)raw / 4095 或乘 1.0f),让除法在浮点域进行。文中附错误版与正确版代码、方案对比及 -Wconversion 配置建议,并延伸介绍无 FPU MCU 的 Q 格式定点数方案。
一、开篇:一个真实翻车现场
一段做标度换算的代码:int raw = 4095; float v = raw / 4095 * 3.3f;,本意把 ADC 原始值换算成电压。结果 v 算出来是 0.0 或 3.3 跳变,中间值全丢。原因:raw / 4095 是两个整数相除,结果先按整数算(4095/4095=1,但若是 2000/4095=0),再转 float → 精度在整数除法那步就丢了。
根因一句话:C 中"两个同类型操作数运算,结果也是该类型"。int / int 做整数除法(截断小数),再赋值给 float 已经晚了——小数已在整数阶段丢失。解法:运算前把至少一个操作数转成浮点((float)raw / 4095 或乘 1.0f),让除法在浮点域进行,保留精度。
适用读者:做 int/int 再赋给 float、发现小数部分全丢/结果跳变的同学。
读完你能做:识别整数除法截断导致的精度丢失,用"先转浮点再运算"保留精度。
二、先搞懂:整数除法截断(认知)
2.1 同类型运算规则
C 的"寻常算术转换":两个整数操作数运算,结果还是整数,除法向零截断(丢弃小数)。5/2 = 2,2000/4095 = 0。只有运算结果赋给 float 才会转,但转换发生在运算之后,小数已没了。
2.2 为什么精度丢
raw / 4095:raw 和 4095 都是 int → 整数除法,截断。即使左边是 2000,结果 0,再 *3.3f 得 0.0f。中间值精度在整数阶段已没。
| 2000/4095*3.3f | 0.0(截断) |
| (float)2000/4095*3.3f | 1.612 |
#mermaid-svg-9xF4GWbIHLXy5AjM{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-9xF4GWbIHLXy5AjM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-9xF4GWbIHLXy5AjM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-9xF4GWbIHLXy5AjM .error-icon{fill:#552222;}#mermaid-svg-9xF4GWbIHLXy5AjM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-9xF4GWbIHLXy5AjM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-9xF4GWbIHLXy5AjM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-9xF4GWbIHLXy5AjM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-9xF4GWbIHLXy5AjM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-9xF4GWbIHLXy5AjM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-9xF4GWbIHLXy5AjM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-9xF4GWbIHLXy5AjM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-9xF4GWbIHLXy5AjM .marker.cross{stroke:#333333;}#mermaid-svg-9xF4GWbIHLXy5AjM svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-9xF4GWbIHLXy5AjM p{margin:0;}#mermaid-svg-9xF4GWbIHLXy5AjM .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-9xF4GWbIHLXy5AjM .cluster-label text{fill:#333;}#mermaid-svg-9xF4GWbIHLXy5AjM .cluster-label span{color:#333;}#mermaid-svg-9xF4GWbIHLXy5AjM .cluster-label span p{background-color:transparent;}#mermaid-svg-9xF4GWbIHLXy5AjM .label text,#mermaid-svg-9xF4GWbIHLXy5AjM span{fill:#333;color:#333;}#mermaid-svg-9xF4GWbIHLXy5AjM .node rect,#mermaid-svg-9xF4GWbIHLXy5AjM .node circle,#mermaid-svg-9xF4GWbIHLXy5AjM .node ellipse,#mermaid-svg-9xF4GWbIHLXy5AjM .node polygon,#mermaid-svg-9xF4GWbIHLXy5AjM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-9xF4GWbIHLXy5AjM .rough-node .label text,#mermaid-svg-9xF4GWbIHLXy5AjM .node .label text,#mermaid-svg-9xF4GWbIHLXy5AjM .image-shape .label,#mermaid-svg-9xF4GWbIHLXy5AjM .icon-shape .label{text-anchor:middle;}#mermaid-svg-9xF4GWbIHLXy5AjM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-9xF4GWbIHLXy5AjM .rough-node .label,#mermaid-svg-9xF4GWbIHLXy5AjM .node .label,#mermaid-svg-9xF4GWbIHLXy5AjM .image-shape .label,#mermaid-svg-9xF4GWbIHLXy5AjM .icon-shape .label{text-align:center;}#mermaid-svg-9xF4GWbIHLXy5AjM .node.clickable{cursor:pointer;}#mermaid-svg-9xF4GWbIHLXy5AjM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-9xF4GWbIHLXy5AjM .arrowheadPath{fill:#333333;}#mermaid-svg-9xF4GWbIHLXy5AjM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-9xF4GWbIHLXy5AjM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-9xF4GWbIHLXy5AjM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9xF4GWbIHLXy5AjM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-9xF4GWbIHLXy5AjM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9xF4GWbIHLXy5AjM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-9xF4GWbIHLXy5AjM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-9xF4GWbIHLXy5AjM .cluster text{fill:#333;}#mermaid-svg-9xF4GWbIHLXy5AjM .cluster span{color:#333;}#mermaid-svg-9xF4GWbIHLXy5AjM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-9xF4GWbIHLXy5AjM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-9xF4GWbIHLXy5AjM rect.text{fill:none;stroke-width:0;}#mermaid-svg-9xF4GWbIHLXy5AjM .icon-shape,#mermaid-svg-9xF4GWbIHLXy5AjM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9xF4GWbIHLXy5AjM .icon-shape p,#mermaid-svg-9xF4GWbIHLXy5AjM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-9xF4GWbIHLXy5AjM .icon-shape .label rect,#mermaid-svg-9xF4GWbIHLXy5AjM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9xF4GWbIHLXy5AjM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-9xF4GWbIHLXy5AjM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-9xF4GWbIHLXy5AjM :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
int除法
转float再除
raw/4095*3.3f
除法域?
截断 精度丢
保留小数
图 1:整数除法截断(如图 1 所示,先转浮点才保精度)。
[注意] 反过来 float 转 int 也会丢小数(向零截断),且大 float 转 int 可能溢出未定义(float 范围远大于 int)。混合运算要清楚每步类型。
三、为什么会丢精度(原理 + 真实错误代码)
3.1 错误版
// ❌ 错:int/int 先截断再转 float
int raw = 2000;
float v = raw / 4095 * 3.3f; // raw/4095 是整数除法 = 0 → v = 0.0
// 期望约 1.612V,实际 0.0
错:①raw(int) / 4095(int) → 整数除法 =0;②0 * 3.3f = 0.0f;③小数在整数阶段丢失。
[坑] 铁律:含除法的标度换算,运算前把操作数转成浮点,避免整数除法截断。
错误链路如下:
#mermaid-svg-XCKWDqOJiXtYEZPq{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-XCKWDqOJiXtYEZPq .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-XCKWDqOJiXtYEZPq .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-XCKWDqOJiXtYEZPq .error-icon{fill:#552222;}#mermaid-svg-XCKWDqOJiXtYEZPq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-XCKWDqOJiXtYEZPq .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-XCKWDqOJiXtYEZPq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-XCKWDqOJiXtYEZPq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-XCKWDqOJiXtYEZPq .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-XCKWDqOJiXtYEZPq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-XCKWDqOJiXtYEZPq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-XCKWDqOJiXtYEZPq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-XCKWDqOJiXtYEZPq .marker.cross{stroke:#333333;}#mermaid-svg-XCKWDqOJiXtYEZPq svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-XCKWDqOJiXtYEZPq p{margin:0;}#mermaid-svg-XCKWDqOJiXtYEZPq .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-XCKWDqOJiXtYEZPq .cluster-label text{fill:#333;}#mermaid-svg-XCKWDqOJiXtYEZPq .cluster-label span{color:#333;}#mermaid-svg-XCKWDqOJiXtYEZPq .cluster-label span p{background-color:transparent;}#mermaid-svg-XCKWDqOJiXtYEZPq .label text,#mermaid-svg-XCKWDqOJiXtYEZPq span{fill:#333;color:#333;}#mermaid-svg-XCKWDqOJiXtYEZPq .node rect,#mermaid-svg-XCKWDqOJiXtYEZPq .node circle,#mermaid-svg-XCKWDqOJiXtYEZPq .node ellipse,#mermaid-svg-XCKWDqOJiXtYEZPq .node polygon,#mermaid-svg-XCKWDqOJiXtYEZPq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-XCKWDqOJiXtYEZPq .rough-node .label text,#mermaid-svg-XCKWDqOJiXtYEZPq .node .label text,#mermaid-svg-XCKWDqOJiXtYEZPq .image-shape .label,#mermaid-svg-XCKWDqOJiXtYEZPq .icon-shape .label{text-anchor:middle;}#mermaid-svg-XCKWDqOJiXtYEZPq .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-XCKWDqOJiXtYEZPq .rough-node .label,#mermaid-svg-XCKWDqOJiXtYEZPq .node .label,#mermaid-svg-XCKWDqOJiXtYEZPq .image-shape .label,#mermaid-svg-XCKWDqOJiXtYEZPq .icon-shape .label{text-align:center;}#mermaid-svg-XCKWDqOJiXtYEZPq .node.clickable{cursor:pointer;}#mermaid-svg-XCKWDqOJiXtYEZPq .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-XCKWDqOJiXtYEZPq .arrowheadPath{fill:#333333;}#mermaid-svg-XCKWDqOJiXtYEZPq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-XCKWDqOJiXtYEZPq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-XCKWDqOJiXtYEZPq .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XCKWDqOJiXtYEZPq .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-XCKWDqOJiXtYEZPq .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XCKWDqOJiXtYEZPq .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-XCKWDqOJiXtYEZPq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-XCKWDqOJiXtYEZPq .cluster text{fill:#333;}#mermaid-svg-XCKWDqOJiXtYEZPq .cluster span{color:#333;}#mermaid-svg-XCKWDqOJiXtYEZPq div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-XCKWDqOJiXtYEZPq .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-XCKWDqOJiXtYEZPq rect.text{fill:none;stroke-width:0;}#mermaid-svg-XCKWDqOJiXtYEZPq .icon-shape,#mermaid-svg-XCKWDqOJiXtYEZPq .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XCKWDqOJiXtYEZPq .icon-shape p,#mermaid-svg-XCKWDqOJiXtYEZPq .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-XCKWDqOJiXtYEZPq .icon-shape .label rect,#mermaid-svg-XCKWDqOJiXtYEZPq .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XCKWDqOJiXtYEZPq .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-XCKWDqOJiXtYEZPq .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-XCKWDqOJiXtYEZPq :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
是
否
int raw = 2000
raw / 4095
两个 int 相除?
整数除法 截断 = 0
0 * 3.3f = 0.0f
v = 0.0V(错)
浮点除法 保留小数
v = 1.612V(对)
3.2 为什么"端点对、中间错"
raw=0 → 0(对),raw=4095 → 1*3.3=3.3(对),中间值(如 2000)全被截断成 0 → 表现为"跳变/丢精度"。
四、正确解法:先转浮点再运算(完整落地)
4.1 方案对比
| int/int 再转 float | 丢 | 错 |
| 转 float 再除 | 保 | 正解 |
4.2 配置(照着点)
开 -Wconversion(GCC)会对隐式窄化转换警告。
4.3 完整代码
// ✅ 正确:运算前转浮点
int raw = 2000;
float v = (float)raw / 4095.0f * 3.3f; // 浮点域除法,保留小数 → 1.612V
// 或乘 1.0f 触发提升
float v2 = raw * 1.0f / 4095 * 3.3f;
[坑] 两个翻车点收好:
正确解法流程如下:
#mermaid-svg-776o700PMgFICs4N{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-776o700PMgFICs4N .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-776o700PMgFICs4N .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-776o700PMgFICs4N .error-icon{fill:#552222;}#mermaid-svg-776o700PMgFICs4N .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-776o700PMgFICs4N .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-776o700PMgFICs4N .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-776o700PMgFICs4N .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-776o700PMgFICs4N .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-776o700PMgFICs4N .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-776o700PMgFICs4N .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-776o700PMgFICs4N .marker{fill:#333333;stroke:#333333;}#mermaid-svg-776o700PMgFICs4N .marker.cross{stroke:#333333;}#mermaid-svg-776o700PMgFICs4N svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-776o700PMgFICs4N p{margin:0;}#mermaid-svg-776o700PMgFICs4N .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-776o700PMgFICs4N .cluster-label text{fill:#333;}#mermaid-svg-776o700PMgFICs4N .cluster-label span{color:#333;}#mermaid-svg-776o700PMgFICs4N .cluster-label span p{background-color:transparent;}#mermaid-svg-776o700PMgFICs4N .label text,#mermaid-svg-776o700PMgFICs4N span{fill:#333;color:#333;}#mermaid-svg-776o700PMgFICs4N .node rect,#mermaid-svg-776o700PMgFICs4N .node circle,#mermaid-svg-776o700PMgFICs4N .node ellipse,#mermaid-svg-776o700PMgFICs4N .node polygon,#mermaid-svg-776o700PMgFICs4N .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-776o700PMgFICs4N .rough-node .label text,#mermaid-svg-776o700PMgFICs4N .node .label text,#mermaid-svg-776o700PMgFICs4N .image-shape .label,#mermaid-svg-776o700PMgFICs4N .icon-shape .label{text-anchor:middle;}#mermaid-svg-776o700PMgFICs4N .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-776o700PMgFICs4N .rough-node .label,#mermaid-svg-776o700PMgFICs4N .node .label,#mermaid-svg-776o700PMgFICs4N .image-shape .label,#mermaid-svg-776o700PMgFICs4N .icon-shape .label{text-align:center;}#mermaid-svg-776o700PMgFICs4N .node.clickable{cursor:pointer;}#mermaid-svg-776o700PMgFICs4N .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-776o700PMgFICs4N .arrowheadPath{fill:#333333;}#mermaid-svg-776o700PMgFICs4N .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-776o700PMgFICs4N .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-776o700PMgFICs4N .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-776o700PMgFICs4N .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-776o700PMgFICs4N .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-776o700PMgFICs4N .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-776o700PMgFICs4N .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-776o700PMgFICs4N .cluster text{fill:#333;}#mermaid-svg-776o700PMgFICs4N .cluster span{color:#333;}#mermaid-svg-776o700PMgFICs4N div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-776o700PMgFICs4N .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-776o700PMgFICs4N rect.text{fill:none;stroke-width:0;}#mermaid-svg-776o700PMgFICs4N .icon-shape,#mermaid-svg-776o700PMgFICs4N .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-776o700PMgFICs4N .icon-shape p,#mermaid-svg-776o700PMgFICs4N .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-776o700PMgFICs4N .icon-shape .label rect,#mermaid-svg-776o700PMgFICs4N .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-776o700PMgFICs4N .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-776o700PMgFICs4N .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-776o700PMgFICs4N :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
是
否
int raw = 2000
(float)raw / 4095.0f
运算前已转浮点?
浮点域除法 保留小数
1.612V(对)
整数除法 截断
0.0V(错)
4.4 改完对比
| raw=2000 电压 | 0.0V(错) | 1.612V |
| 中间值精度 | 丢 | 保 |
五、收尾
要点复盘
最佳实践清单
- 除法标度:用 (float)a / b 或 *1.0f 触发浮点除法。
- 明确每步运算类型,避免隐式截断。
- 开 -Wconversion 抓隐式窄化。
- 大数值 float→int 用 lround + 范围检查防溢出。
- 定点运算(Q 格式)可避免浮点开销,适合无 FPU MCU。
进阶延伸:无 FPU 的 MCU 用 Q 格式定点数(整数+缩放因子)替代 float,既快又无精度截断坑;注意 Q 格式乘除的移位。
互动:你类型转换还踩过啥?uint8 运算回绕、double 截断、隐式提升(第42讲)?评论区聊。
网硕互联帮助中心




评论前必须登录!
注册