2010-07-21 95 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