You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用1e-3时__android_log_print输出结果异常?

Android __android_log_print 输出异常原因解析

核心问题:可变参数的类型不匹配导致栈错位

你的代码出现的异常,本质是格式化符与参数类型不匹配引发的可变参数栈读取错位:

  • 1e-3是C语言中的double类型常量,当int类型的test1和它相乘时,会触发隐式类型转换:test1被提升为double,计算结果也是double(在栈中占8字节内存)。
  • 而你在格式化字符串里用的是%d,这个格式化符告诉__android_log_print要读取一个4字节的int类型数据。当栈里实际是8字节的double时,函数只会读取前4字节作为第一个%d的值,剩下的4字节会被当作第二个%d的参数,直接导致后续参数的位置全部错乱:
    • 第一个日志中,(test1 * 1e-3)的前4字节恰好对应test2的值222222222,剩下的4字节是无效值,所以输出test2 = 0 ms。
    • 第二个日志中,你多传了一个test3,错位后第二个%d刚好读到test3的数值,所以看起来test2的输出正常,但这只是巧合,本质还是参数栈的读取错误。

为什么去掉1e-3就正常?

当直接传入test1(int类型,占4字节)时,%d格式化符能准确匹配栈中的参数位置,函数按预期读取每个4字节的int数据,所以输出完全正常。

修复方案

方案1:用整数运算替代浮点运算(适合取整场景)

如果你的需求是将毫秒值转换为秒(取整),直接用整数除法可以避免类型转换问题:

__android_log_print(ANDROID_LOG_ERROR, "mingxuanli0", " test1 = %d ms test2 = %d ms", (test1 / 1000), test2);

方案2:匹配浮点类型的格式化符(适合保留精度场景)

如果需要保留浮点计算的精度,把格式化符改为%f(对应double类型),同时可以指定小数位数:

__android_log_print(ANDROID_LOG_ERROR, "mingxuanli0", " test1 = %.3f ms test2 = %d ms", (test1 * 1e-3), test2);

内容的提问来源于stack exchange,提问作者oliveira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 01:35:15