我正在为 C 代码编写 java 绑定,但我对 C 并不十分熟悉。
我有一个 uint64_t,需要将其转换为 int。有谁知道这是怎么做到的吗?(我的绑定然后返回一个jint ...)
我正在为 C 代码编写 java 绑定,但我对 C 并不十分熟悉。
我有一个 uint64_t,需要将其转换为 int。有谁知道这是怎么做到的吗?(我的绑定然后返回一个jint ...)
通常,使用像“uint64_t”这样的精确宽度整数是有充分理由的。如果您将其转换为可能不是 64 位长的 int,您可能会遇到严重的问题......
简短的回答:
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 */
如果您正在编写 JNI 包装器,则 uint64_t 的最佳匹配是 long,而不是 int。即使那样,您也会失去准确性,因为 Java 没有无符号类型(因此是 u),并且您需要准备检查值的符号。
请注意,java 不支持无符号类型。java 中最接近的类型是 long,因为它也有 64 位。将 uint64 转换为 long 不会丢失数据,因为位数相同,但较大的值将显示为负数。
whatever_your_int_var_name_is = (int)whatever_your_uint64_t_var_name_is;
嗯...我在 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; 到目前为止,一切都很好...