2014-02-27 69 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位可以修整原来的双值)。

相关问题