回答
通常,使用像'uint64_t'这样的精确宽度的整数是有原因的。 如果您将其转换为int,这可能不是64位长,你可能有严重的问题......
whatever_your_int_var_name_is = (int)whatever_your_uint64_t_var_name_is;
注意,Java不支持无符号类型。 java中最接近的类型将会很长,因为它也有64位。 长uint64不会丢失数据,因为位数相同,但是较大的值将显示为负数。
简短的回答:
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没有无符号类型(因此你没有),你需要准备检查值的符号。
有没有办法在Java中存储C的uint64_t? 在我的情况下,uint64_t始终是一个正数 – mkn 2010-07-21 11:26:35
如果您希望uint64_t *只是*将它作为标识符传递给java(并返回C),请使用long - 不会降级,但值大于2^63会变成负值 - 长达64位的定义,但使用一点点作为标志。 – 2010-07-21 11:53:03
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完成了它; 迄今为止这么好...
'jlong'似乎很适合你的目的。 – 2010-07-21 11:35:00
- 1. 从'uint64_t'转换为'unsigned int'
- 2. 将uint64_t转换为uint8_t [8]
- 3. 将uint64_t转换为std :: string
- 4. TR1 ::哈希uint64_t中
- 5. Arduino中的Serial.print uint64_t
- 6. 转换uint64_t中为void *和背部
- 7. char [] to uint64_t
- 8. uint64_t的容量?
- 9. 用bash将hex转换为uint64_t
- 10. 将字节数组转换为uint64_t?
- 11. 如何将无符号转换为uint64_t?
- 12. C++将字符串转换为uint64_t
- 13. 如何在gcc中打印UINT64_t?
- 14. uint64_t中在32位机写入
- 15. 按位变速操作uint64_t中可变
- 16. 如何在C++ 11中初始化uint64_t
- 17. 如何在C使用uint64_t中
- 18. uint64_t在C充当uint32_t
- 19. 浓缩3漂浮到uint64_t
- 20. 如何使用uint64_t和-m32?
- 21. uint64_t只有32位宽?
- 22. 存储int16_t在uint64_t的
- 23. uint64_t的标准位表示?
- 24. 允许在int为空的int文本框中为null int
- 25. 勘定INT ***为int [] [] []
- 26. 在Haskell中将Maybe Int转换为Int
- 27. 在Haskell中将Int分为Int
- 28. 从const int转换为C++中的int
- 29. 在'C'中将int转换为int []
- 30. 转换类型为int(C :: *)(INT,CHAR)为int类型(INT,CHAR)
那么,有什么办法可以避免这些问题?或者'uint64_t'等价于一个'int',无论它在哪里都可以使用? – JohnK 2013-04-24 21:55:59
int的大小取决于实现。在今天的计算机上,它通常是32位,但它可能只是任何东西......所以很显然,将uint64_t转换为int可能会导致截断的整数... – Macmade 2013-04-24 22:02:07
所以它会工作到一个长长'而不是? – JohnK 2013-04-24 22:59:46