C uint64\u t至int

C uint64\u t至int,c,java-native-interface,casting,uint64,C,Java Native Interface,Casting,Uint64,我正在为C代码编写java绑定,但我对C不太熟悉 我有一个uint64\u t,需要将它转换为int。有人知道怎么做吗? (我的绑定返回一个jint…通常,使用像'uint64\u t'这样的精确宽度整数是有充分理由的。 如果将其强制转换为int(长度可能不是64位),则可能会出现严重问题…请注意,java不支持无符号类型。java中最接近的类型是long,因为它也有64位。 whatever_your_int_var_name_is = (int)whatever_your_uint64_t_

我正在为C代码编写java绑定,但我对C不太熟悉

我有一个uint64\u t,需要将它转换为int。有人知道怎么做吗?
(我的绑定返回一个jint…

通常,使用像'uint64\u t'这样的精确宽度整数是有充分理由的。
如果将其强制转换为int(长度可能不是64位),则可能会出现严重问题…

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

简短回答:

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 */

if(foo-INT\u MIN如果您正在编写JNI包装器,uint64的最佳匹配是long,而不是INT。即使这样,您也会失去准确性,因为Java没有无符号类型(因此是u),您需要准备检查值的符号。

hm。。。 我有一个C语言的方法,返回一个页面ID,它是一个uint64\t编号。现在我需要将该编号存储在Java HashMap中。那么,将uint64\t存储在Java HashMap中的最佳方法是什么呢?问题是,当我执行查找操作时,我需要在HashMap中获取该特定值,并将其转换回uint64\t,以便调用functC代码中的一个参数,它需要一个uint64_t作为参数

另外,我用jlong pid=(jlong)pid_in_uint64_t;
到目前为止还不错……

有没有办法在java中存储C的uint64\u t?在我的例子中,uint64\u t始终是一个正数,如果您希望uint64\u t将其作为标识符传递给java(并返回到C),使用long-不会出现降级,但大于2^63的值将变为负值-long定义为64位,但使用位作为符号。
jlong
似乎很适合您的目的。那么,如何避免出现问题呢?或者
uint64_t
是否等同于
int
在任何可以使用的地方?si
int
的大小取决于实现。在今天的计算机上,它通常是32位,但它可以是任何东西……因此显然,将
uint64\u t
转换为
int
可能会导致整数被截断……这个问题是关于Java的,据我所知,在C中没有
long
这样的东西,问题是一样的。虽然它在今天的大多数实现中都会起作用,但是
long
的大小仍然是由实现定义的。所以不要依赖于此。