0

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

只需键入铸造:

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

由于操作未定义,因此更改值。

那么如何将无符号长整数转换为有符号长整数,同时保持与之前相同的数值呢?

更新

看来问题是由于我的测试中出现的指针取消引用错误而发生的。演员并没有改变价值。感谢所有评论/回答的人,至少现在我知道这是一个完全合法的操作。

4

1 回答 1

1

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

仅当强制转换值溢出有符号目标类型(64 位整数)时,强制转换才构成未定义的行为,对于 1000000000000 或“可用内存量”都不应该发生这种情况(并且在运行时使用可防止病态情况发生)if (dwl > JLONG_MAX) raise_error())。我的猜测是您误解了测试。常量 1000000000000 在编译时溢出32 位整数并编译为 -727379968。改变价值的不是演员阵容,而是价值一开始就被破坏了。

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

于 2012-12-12T05:05:14.130 回答