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);
}
Run Code Online (Sandbox Code Playgroud)
我希望x和y增加到我们用完的位数,但在这种情况下,似乎x和y总是0 ...
Ada*_*eld 16
正如其他人所说,你应该使用%f格式来打印浮点数,而不是%d整数.还有%e,用科学记数法打印浮子而不是固定符号,还有%g,它以科学或固定的方式打印,以较短者为准.
它打印为0的原因是因为当参数作为参数传递给可变参数函数(即带有未指定数量的参数的函数)时,浮点参数会自动转换为双精度数printf().数字2和3(的值的表示x和y)作为双打分别0x4000000000000000和0x4008000000000000,如由所计算的IEEE-754浮点数转换计算器.
在little-endian机器上(例如任何基于x86的机器),%d修饰符从堆栈中抓取下4个字节并将它们解释为整数.因此,当您传递浮点数2时,它将转换为双精度为0x4000000000000000,在little-endian中为00 00 00 00 00 00 00 40.前四个字节使整数为0,这就是打印出的内容.
请注意,如果您在一个语句中打印两个数字而不是两个,则会得到更令人惊讶的结果:
printf("x=%d y=%d\n", x, y);
// Output: x=0 y=1073741824
Run Code Online (Sandbox Code Playgroud)
如果您将警告级别设置得足够高,大多数编译器都会警告您这些类型的错误.使用GCC,您应该使用-Wformat选项(或-Wall包括-Wformat)进行编译,当您尝试%d意外打印浮动时它会发出警告.
Jef*_*ffH 12
%d是一个整数.
http://www.cplusplus.com/reference/clibrary/cstdio/printf/
使用%f表示浮点数:
printf("x is %f\n", x);
printf("y is %f\n", y);
Run Code Online (Sandbox Code Playgroud)