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

use*_*466 1 c floating-point

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(的值的表示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=%d y=%d\n", x, y);
// Output: x=0 y=1073741824
Run Code Online (Sandbox Code Playgroud)

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

  • 完全正确,除了在达到printf语句时x和y都应该是2 ^ 24(单精度为2 ^ 24 + 1轮到2 ^ 24).作为一个双,2 ^ 24是0x4170000000000000,所以你的分析的其余部分都很好. (2认同)

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)