2014-02-27 109 views
0

的地方雙重價值看到這些線路中的程序:存儲在unsigned int類型

if (ftPtr) { 
    *ftPtr = feet; 
} 

注意feet包含double值作爲modf()結果。另一方面,ftPtrunsigned int變量的地址。

問題 現在這個程序沒有任何預兆的運行良好,但它留下了不好的味道在我嘴裏說double值分配給int變量。在C中使用地址koshher將int值賦給int變量?

#include <stdio.h> 
#include <math.h> 

void metersToFeetAndInches(double meters, unsigned int *ftPtr, double *inPtr) { 
    double feet; 
    double inches; 

    double rawFeet = meters * 3.281; 

    inches = modf(rawFeet, &feet); 

    if (ftPtr) { 
     *ftPtr = feet; 
    } 

    if (inPtr) { 
     *inPtr = inches; 
    } 
} 

int main(int argc, const char * argv[]) 
{ 
    double meters = 1.80; 
    unsigned int feet; 
    double inches; 

    metersToFeetAndInches(meters, &feet, &inches); 
    printf("%.2f meters is %d feet and %.2f", meters, feet, inches); 
    return 0; 
} 

回答

4

是的,這是好的。

double將首先轉換爲unsigned int,然後它將被存儲。這是因爲如果你這樣寫:

if (ftPtr) { 
    *ftPtr = (unsigned int)feet; 
} 
1

指針只是一個地址:

一個char pointer可以指向一個數據塊,它可以是任何東西(intcharlongdouble)。但是,當您打印它時,您將只看到可以包含在該數據類型中的數據。即在這種情況下,如果字符指針指向int,那麼將僅打印int1st byte。沒有傷害完成。

但它會是不正確的,不是你所期望的。

0

你可以在一個unsigned int中存儲一個double,但大小不一樣。 32位系統中sizeof(unsigned int)爲4時,sizeof(double)爲8.因此,您可以在4字節長的空間中存儲8字節長的值,但可能會丟失數據(高4位可以修整原來的雙值)。

相關問題