【发布时间】:2012-12-12 04:12:29
【问题描述】:
我正在尝试从 DWORDLONG 类型(在 WIN32 中定义为无符号 64 位 int)返回类型 jlong(在 JNI 中定义为有符号的 64 位 long 值)。
简单的类型转换:
DWORDLONG dwl = 1000000000000;
jlong n = (jlong) dwl;
由于操作未定义而更改值。
那么如何将无符号长整数转换为有符号长整数,同时保持与之前相同的数值?
更新
看来问题的发生是因为我的测试中出现了指针取消引用错误。演员并没有改变价值。感谢所有评论/回答的人,至少现在我知道这是一个完全合法的操作。
【问题讨论】:
-
对于 64 位有符号整数范围内的正数(并且 1E12 正好在范围内),显示的强制转换应该可以工作(但如果您添加 LL 或等效后缀会更可靠价值)。如果不是,则您的期望可能不匹配(某些不是您认为是 64 位值的 64 位),或者编译器中可能存在错误。我不确定是否还有很多其他选择。你怎么知道价值在改变?您是在 C 代码中打印它,还是在等待 Java 代码获取它?转换前是否打印了
dwl? -
有什么理由不能使用
jlong? -
jint未定义为 64 位。它被定义为 32 位:docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/types.html 你的意思是jlong吗? -
我很抱歉。我的意思是jlong。我不知道我为什么输入 jint。
-
不应该是
1000000000000是1000000000000LL?
标签: c winapi java-native-interface type-conversion