2

我正在为 C 代码编写 java 绑定,但我对 C 并不十分熟悉。

我有一个 uint64_t,需要将其转换为 int。有谁知道这是怎么做到的吗?(我的绑定然后返回一个jint ...)

4

6 回答 6

6

通常,使用像“uint64_t”这样的精确宽度整数是有充分理由的。如果您将其转换为可能不是 64 位长的 int,您可能会遇到严重的问题......

于 2010-07-21T11:18:56.530 回答
6

简短的回答:

uint64_t foo;
int bar;
bar = foo;

从技术上讲,如果 的值foo不适合int. 在实践中,它总是会简单地截断高位。如果你想更正确,那么:

if (foo-INT_MIN <= (uint64_t)INT_MAX-INT_MIN)
    bar = foo;
else
    /* error case here */
于 2010-07-21T11:21:21.130 回答
3

如果您正在编写 JNI 包装器,则 uint64_t 的最佳匹配是 long,而不是 int。即使那样,您也会失去准确性,因为 Java 没有无符号类型(因此是 u),并且您需要准备检查值的符号。

于 2010-07-21T11:22:05.590 回答
2

请注意,java 不支持无符号类型。java 中最接近的类型是 long,因为它也有 64 位。将 uint64 转换为 long 不会丢失数据,因为位数相同,但较大的值将显示为负数。

于 2010-07-21T11:19:35.843 回答
1
whatever_your_int_var_name_is = (int)whatever_your_uint64_t_var_name_is;
于 2010-07-21T11:19:06.370 回答
0

嗯...我在 C 中有一个方法,它返回一个 page_ID,它是一个 uint64_t 数字。现在我需要将该数字存储在 Java HashMap 中。那么将 uint64_t 存储在 Java HashMap 中的最佳方式是什么?问题是,当我进行查找操作时,我需要将 HashMap 中的特定值转换回 uint64_t 以便我可以在 C 代码中调用一个函数,该函数需要一个 uint64_t 作为参数。

PS 我已经用 jlong​​ pid = (jlong​​) pid_in_uint64_t; 到目前为止,一切都很好...

于 2010-07-21T11:32:58.233 回答