2010-07-21 35 views
2

我正在写一个Java的C代码绑定和我不是很熟悉C.uint64_t中为int

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

回答

6

通常,使用像'uint64_t'这样的精确宽度的整数是有原因的。 如果您将其转换为int,这可能不是64位长,你可能有严重的问题......

+0

那么,有什么办法可以避免这些问题?或者'uint64_t'等价于一个'int',无论它在哪里都可以使用? – JohnK 2013-04-24 21:55:59

+0

int的大小取决于实现。在今天的计算机上,它通常是32位,但它可能只是任何东西......所以很显然,将uint64_t转换为int可能会导致截断的整数... – Macmade 2013-04-24 22:02:07

+0

所以它会工作到一个长长'而不是? – JohnK 2013-04-24 22:59:46

0
whatever_your_int_var_name_is = (int)whatever_your_uint64_t_var_name_is; 
2

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

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

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

+0

有没有办法在Java中存储C的uint64_t? 在我的情况下,uint64_t始终是一个正数 – mkn 2010-07-21 11:26:35

+2

如果您希望uint64_t *只是*将它作为标识符传递给java(并返回C),请使用long - 不会降级,但值大于2^63会变成负值 - 长达64位的定义,但使用一点点作为标志。 – 2010-07-21 11:53:03

0

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

P.S.我用jlong​​ pid =(jlong​​)pid_in_uint64_t完成了它; 迄今为止这么好...

+0

'jlong​​'似乎很适合你的目的。 – 2010-07-21 11:35:00