2011-04-26 128 views
2

我在32位機器上有一個long int的int [2]表示形式,並且想要在64位機器上將其轉換爲long。是否有一個安全的架構獨立的方式來做這種轉換?將int [2]轉換爲long

源機器是32位,int是32位。目標機器是64位,長整型是64位。

我可以做以下嗎?

long i; 
int j[2]; 
#ifdef LITTLEENDIAN 
j[1] = *(int*)(&i); 
j[0] = *(((int*)(&i))+1) 
#else 
j[0] = *(int*)(&i); 
j[1] = *(((int*)(&i))+1) 
#endif 

如果以上錯誤,那麼最好和最安全的方法是什麼?我確信之前會問這個問題,但我沒有找到一個乾淨的答案。

由於

+2

這取決於你所說的 「一個'INT [2]''一個長int'的代表權」 的意思。你是如何創建這種表示的? – 2011-04-26 15:34:17

+1

字節順序不是唯一的問題:對於特定機器上的特定編譯器,sizeof(int)可能等於sizeof(long)。在這種情況下,你的代碼應該什麼都不做。 – 2011-04-26 15:36:53

+0

例如在64位Windows上,「long」是32位。 – 2011-04-26 15:38:29

回答

4

我有一個int [2]在一個32位的機一長整型的表示,並希望將其轉換爲長64位計算機上。是否有一個安全的架構獨立的方式來做這種轉換?

不是。因爲除了字節排列之外,兩種數據類型的大小也可能會有所不同。在一些流行的平臺,intlong相同大小(32位)

歸根結底,這取決於您是如何創建int[2]表示。無論您如何創建int陣列,都必須將其顛倒過來才能獲得有效的long

一種方法,這將在實際工作(但是,從技術上來說,不確定的行爲),是放置在兩個工會:

union { 
    int i2[2]; 
    long l; 
} u; 

現在,你可以簡單地寫u.i2u.l讀取。 C++標準在技術上不允許這樣做(這是未定義的行爲),但主流編譯器無論如何明確支持它是一種常見的技巧。

但是,更好的方法可能是使用char[]而不是int[],因爲char的顯式允許使用其他類型的別名。

+0

謝謝,這對我很有用。我無法直接使用int64的原因是由於輸入來自第三方,我無法控制它。 – Kiran 2011-04-26 17:14:20

1

如果您確定有32位整數和64位,那麼您可以使用union概念。

union Convert 
{ 
    long i; 
    int j[2]; 
};