C 为什么x和y总是带浮点数的0? int main(无效){ 浮动x=1; 浮动y=2; 而(x

C 为什么x和y总是带浮点数的0? int main(无效){ 浮动x=1; 浮动y=2; 而(x,c,floating-point,C,Floating Point,一件事:在printf中不应使用%d作为浮点,而应使用%f,%e或%g一件事:在printf中不应使用%d作为浮点,而应使用%f,%e或%g作为整数 将%f用于浮点数: 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); }

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

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

将%f用于浮点数:

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);
}
%d代表一个整数

将%f用于浮点数:

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);
}

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

它打印为0的原因是,当浮点参数作为参数传递给变量函数(即采用未指定数量参数的函数)时,会自动转换为双精度参数,例如
printf()
。数字2和3的表示形式(值
x
y
)as Double分别为0x4000000000和0x40080000000000,由计算得出

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

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

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

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

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

它打印为0的原因是,当浮点参数作为参数传递给变量函数(即采用未指定数量参数的函数)时,会自动转换为双精度参数,例如
printf()
。数字2和3的表示形式(值
x
y
)as Double分别为0x4000000000和0x40080000000000,由计算得出

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

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

printf("x is %f\n", x);
printf("y is %f\n", y);
如果您将警告级别设置得足够高,大多数编译器都可以警告您这些类型的错误。对于GCC,您应该使用
-Wformat
选项(或
-Wall
,其中包括
-Wformat
)进行编译,并且当您试图意外地使用
%d
打印浮点时,它会警告您

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

不,而是当你的精度不够时,循环就会停止。我相信在某一点上,这个数字会足够大,以至于1.0f的增量太小而无法表示,x将等于y

当您修复输出格式时,我猜您会看到这种情况

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

不,而是当你的精度不够时,循环就会停止。我相信在某一点上,这个数字会足够大,以至于1.0f的增量太小而无法表示,x将等于y


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

%d表示整数,使用%f


您将耗尽位,但与整数不完全一样,您最终将溢出指数,这将导致异常,尽管您可能不知道。我忘了这是否会导致nan或无穷大。这会使小于变得相互交织。我想知道为什么while循环不会永远运行。

%d表示整数,使用%f


您将耗尽位,但与整数不完全一样,您最终将溢出指数,这将导致异常,尽管您可能不知道。我忘了这是否会导致nan或无穷大。这会使小于变得相互交织。我想知道为什么while循环不会永远运行。

这个错误很容易犯e、 但是很难被制造它的人理解。向其他人询问,你会在一分钟内得到答案:)事实上,浮点没有printf转换说明符。转换说明符
%f
需要一个双参数:幸运的是,当printf()时,浮点参数被转换为双参数我的建议是:永远不要使用float;始终使用double。这个错误很容易犯,但犯错误的人很难纠正。如果问别人,你会在一分钟内得到答案:)事实上,float没有printf转换说明符。转换说明符
%f
需要一个双参数:幸运的是float ar调用printf()时,guments将转换为double。我的建议是:永远不要使用浮点;始终使用double。完全正确,只是当达到printf语句时,x和y都应为2^24(单精度为2^24+1轮到2^24)。