为什么x和y总是带浮点数?

int main(void){ float x =1; float y =2; while (x<y){ x = x +1 ; y = y +1; } printf("x is %d\n", x); printf("y is %d\n", y); } 

我希望x和y增加到我们用完的位数,但在这种情况下似乎x和y总是0 …

正如其他人所说,你应该使用%f格式来打印浮点数,而不是%d ,这是整数。 还有%e ,它以科学记数法而不是固定符号打印浮点数,还有%g ,它以科学或固定的方式打印,以较短者为准。

它打印为0的原因是因为float参数在作为参数传递给variadic函数(即带有未指定数量的参数的函数)(如printf()时自动转换为double。 数字2和3( xy的值)作为双精度的表示分别是0x4000000000000000和0x4008000000000000,由IEEE-754浮点转换计算器计算 。

在little-endian机器上(例如任何基于x86的机器), %d修饰符从堆栈中获取接下来的4个字节并将它们解释为整数。 因此,当您传递浮点数2时,它将转换为双精度为0x4000000000000000,在little-endian中为00 00 00 00 00 00 00 40.前四个字节使整数为0,这就是打印出来的内容。

请注意,如果您在一个语句中打印两个数字而不是两个,则会得到更令人惊讶的结果:

 printf("x=%dy=%d\n", x, y); // Output: x=0 y=1073741824 

如果您将警告级别设置得足够高,大多数编译器都会警告您这些类型的错误。 使用GCC,您应该使用-Wformat选项(或-Wall ,包括-Wformat )进行编译,当您尝试使用%d意外打印浮点数时它会发出警告。

%d是一个整数。

http://www.cplusplus.com/reference/clibrary/cstdio/printf/

使用%f表示浮点数:

 printf("x is %f\n", x); printf("y is %f\n", y); 

一件事:你不应该在printf中使用%d作为浮点数,而是使用%f,%e或%g

我希望x和y增加到我们用完的位数

不,相反,当精度不足时,循环将停止。 我相信在某些时候,数字会足够大,1.0f的增量太小而无法表示,x将等于y。

当你修改输出格式时,我猜你会看到这种情况。

%d用于整数,使用%f。

你将耗尽比特,但不完全像一个整数,你最终会溢出指数,这应该会导致exception,虽然你可能不会知道。 如果那会导致纳米或无穷大,我会忘记。 这使得少于获得互动。 我想知道为什么while循环不会永远运行。