在C中将无符号长整数转换为64位有符号长整数

时间:2012-12-12 04:12:30

标签: c winapi java-native-interface type-conversion

我试图从类型DWORDLONG(在WIN32中将其定义为无符号的64位int)返回类型jlong​​(在JNI中定义为带符号的64位长值)。

只需输入:

DWORDLONG dwl = 1000000000000;
jlong n = (jlong) dwl;

更改值,因为操作未定义。

如何将无符号长整数转换为有符号长整数,并保持之前的相同数值?

更新

似乎问题正在发生,因为我的测试中出现了指针解除引用错误。演员没有改变价值。感谢所有评论/回答的人,至少现在我知道这是完全合法的操作。

1 个答案:

答案 0 :(得分:1)

你是如何得出演员改变价值的结论?

仅当转换值溢出签名目标类型(64位整数)时,强制转换才构成未定义的行为,对于1000000000000或“可用内存量”不应该发生(并且运行时会保护病态案例) -time使用if (dwl > JLONG_MAX) raise_error())。我的猜测是你误解了考试;常量1000000000000在编译时溢出 32位整数,编译为-727379968。不是演员改变了价值,价值开始腐败。

正如评论中已经建议的那样,在测试程序中将1000000000000更改为1000000000000LL,问题就会消失。