我正在编写这个程序,我注意到,使用%f表示双精度型,使用%d表示浮点型,会给我带来完全不同的结果。有人知道为什么会这样吗?
int main ()
{
float a = 1F;
double b = 1;
printf("float =%d\ndouble= %f", a, b);
}这是输出
float = -1610612736
double = 190359837192766135921612671364749893774625551025007120912096639276776057269784974988808792093423962875123204096.0000发布于 2010-02-17 00:19:21
由于变量参数的工作方式,除了%d和%f之外,C不知道您实际传递给它的值的类型。当你传入一个变量参数时,你基本上就是在做(void*)&myvalue,因为编译器和运行时的函数都不能确定变量的类型,除了格式化字符串中给出的类型。因此,即使有隐式转换可用,编译器也不知道需要它。
在大多数系统中,双精度是8个字节,而浮点数是4个字节。因此,这两种类型并不是二进制兼容的。这就像试图将字符串解释为双精度类型或其他不兼容的类型。
发布于 2010-02-17 00:25:42
%d代表decimal,它需要一个int类型的参数(或某种更小的有符号整数类型,然后提升)。浮点类型float和double都以相同的方式传递(提升为double),并且它们都使用%f。在C99中,您也可以使用%lf来表示较大的double大小,但这纯粹是表面上的(请注意,在scanf中不会发生提升,这实际上会有所不同)。
发布于 2010-02-17 00:18:58
它与数据的内部表示有关。您正在尝试打印一个浮点数,就像它是一个int一样,它有一个完全不同的内部(二进制)表示。
double的情况与此类似。在float变量后面可能有垃圾(任何数据)。该垃圾被解释为双精度值的一部分。
https://stackoverflow.com/questions/2274336
复制相似问题