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 ...
答案 0 :(得分:16)
正如其他人所说,您应该使用%f
格式来打印浮点数,而不是%d
,这是整数。还有%e
,用科学记数法打印浮点数而不是固定符号,还有%g
,它以科学或固定的方式打印,以较短者为准。
它打印为0的原因是因为当作为参数传递给可变参数函数(即带有未指定数量的参数的函数)(例如printf()
)时,浮点参数会自动转换为双精度数。数字2和3(x
和y
的值)的双重表示分别为0x4000000000000000和0x4008000000000000,由IEEE-754 Floating-Point Conversion calculator计算。
在little-endian机器上(例如任何基于x86的机器),%d
修饰符从堆栈中抓取接下来的4个字节并将它们解释为整数。因此,当您传递浮点数2时,它将转换为双精度为0x4000000000000000,在little-endian中为00 00 00 00 00 00 00 40.前四个字节使整数为0,这就是打印出的内容。 / p>
请注意,如果您在一个语句中打印两个数字而不是两个,则会得到更令人惊讶的结果:
printf("x=%d y=%d\n", x, y);
// Output: x=0 y=1073741824
如果将警告级别设置得足够高,大多数编译器都会警告您这些类型的错误。使用GCC,您应该使用-Wformat
选项(或-Wall
,包括-Wformat
)进行编译,当您尝试使用%d
打印浮点数时,它会发出警告事故。
答案 1 :(得分:12)
%d是一个整数。
http://www.cplusplus.com/reference/clibrary/cstdio/printf/
使用%f表示浮点数:
printf("x is %f\n", x);
printf("y is %f\n", y);
答案 2 :(得分:3)
一件事:你不应该在printf中使用%d代表浮点数,而是使用%f,%e或%g代替
答案 3 :(得分:1)
我希望x和y增加到我们用完的位
不,相反,当精度不足时,循环将停止。我相信在某些时候,数字会足够大,1.0f的增量太小而无法表示,x将等于y。
当您修复输出格式时,我猜您会看到情况。
答案 4 :(得分:0)
%d表示整数,使用%f。
你将耗尽比特,但不完全像一个整数,你最终将溢出指数,这应该会导致异常,虽然你可能不会知道。如果那会导致纳米或无穷大,我会忘记。这使得少于获得互动。我想知道为什么while循环不会永远运行。