2016-01-14 83 views
1

假設我有一個工會的定義爲:使用union將double轉換爲int?

typedef union{ 
    double d; 
    int i; 
} dtoi; 

如果我想要一個雙轉換爲int,我有以下功能:

int doubleToInt(double d){ 
    dtoi dToI; 
    dToI.d = d; 
    return dToI.i; 
} 

後來我還有一個功能轉換它回到雙倍:

double intToDouble(dtoi dToI){ 
    return dToI.d; 
} 

這項工作?現在我想我得到一個錯誤的價值雙倍。我想我不太瞭解如何在功能和模塊之間實現聯合和傳遞聯合作爲參數。

+0

你試過了return(int)dToI.d嗎? –

回答

2

不,這不起作用。一方面,int通常是32位,而double通常是64.另一方面,浮點值基本上被分割成位字段,其中有很多位保存尾數,很多位保存指數,一位保存符號。另一方面,整數只是數字的基數2表示。他們的位不一樣。

要正確地將雙「d」轉換爲int,請嘗試int i = (int)d;,反之:double d = (double)i;。這些實際上將值從一種格式轉換爲另一種格式。工會只是重新解釋現有的位。

3

這項工作?

不,這不行。

當您使用union時,設置一個成員並提取不同成員是未定義的行爲。

當您設置int成員時,應該只提取int成員。

您可以在不使用union的情況下實施doubleToInt

int doubleToInt(double d){ 
    return (int)d; 
} 

你並不需要一個函數來的int轉換爲double。編譯器會自動爲你做到這一點。如果你必須有一個功能,這是微不足道的。

double intToDouble(int in) { 
    return in; 
} 
+1

但是當我將它轉換成雙倍數時,我會在小數點後丟失數字 – ballballbobo

+0

@ballballbobo,正如醫生所說,「如果這樣做會傷害,那就不要這麼做。」只需保留'double',並在只需要整數部分時將其轉換爲'int'。 –