我试图从类型DWORDLONG(在WIN32中将其定义为无符号的64位int)返回类型jlong(在JNI中定义为带符号的64位长值)。
只需输入:
DWORDLONG dwl = 1000000000000;
jlong n = (jlong) dwl;
更改值,因为操作未定义。
如何将无符号长整数转换为有符号长整数,并保持之前的相同数值?
更新
似乎问题正在发生,因为我的测试中出现了指针解除引用错误。演员没有改变价值。感谢所有评论/回答的人,至少现在我知道这是完全合法的操作。
答案 0 :(得分:1)
你是如何得出演员改变价值的结论?
仅当转换值溢出签名目标类型(64位整数)时,强制转换才构成未定义的行为,对于1000000000000或“可用内存量”不应该发生(并且运行时会保护病态案例) -time使用if (dwl > JLONG_MAX) raise_error()
)。我的猜测是你误解了考试;常量1000000000000在编译时溢出 32位整数,编译为-727379968。不是演员改变了价值,价值开始腐败。
正如评论中已经建议的那样,在测试程序中将1000000000000更改为1000000000000LL,问题就会消失。