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

Android原生C中size_t转jlong值异常问题求助

解决size_t转jlong时的数值异常问题

嘿,我来帮你搞定这个问题!你遇到的情况看起来像是日志格式化错误+类型转换的小陷阱,咱们一步步拆解:

首先,你看到的负数不是转换的真实结果——是日志格式符用错了!

在Android里,jlong是64位的有符号整数(本质是long long),但你用了%ld来打印它。%ld对应的是32位的long类型,用这个格式符去读64位变量的话,会读取错误的内存片段,导致输出完全不对的数值(就是你看到的那个负数)。

先把日志代码改对:

// 用%lld对应64位的jlong
ALOG("Size of test after casting %lld.", (jlong)test);

如果想要更严谨(适配不同平台的格式规范),可以包含<inttypes.h>头文件,用标准的64位整数格式宏:

#include <inttypes.h>
// ...
ALOG("Size of test after casting %" PRId64 ".", (jlong)test);

然后,确保类型转换的安全性

虽然你的test值319488很小,直接转jlong不会有问题,但为了避免在其他场景下(比如size_t的值超过jlong的正数范围)出现符号扩展问题,建议用更安全的转换方式:
先把size_t转成64位无符号整数uint64_t,再转成jlong——这样会把32位的无符号值零扩展到64位,不会触发有符号数的符号扩展:

#include <stdint.h>
// ...
size_t test = lzfse_decode_buffer(dst_buffer, dst_size, src_buffer, src_size, NULL);
jlong safe_result = (jlong)(uint64_t)test;
ALOG("Size of test after safe casting %lld.", safe_result);

验证一下

修复格式符之后,你应该能看到转成jlong后的结果也是319488,那个负数只是日志打印的假象而已。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:40:45