可能这是一个简单的问题,但我不确定浮点变量如何存储在内存中以及为什么它会以这种方式运行,有人可以解释一下以下行为。
#include<stdio.h>
int main ()
{
int a = 9/5;
printf("%f\n", a);
return 0;
}
输出:
0.000000
我查看了一些关于浮点变量如何存储在内存中的信息,它包含关于尾数、指数和符号的内容。但我不知道如何在这里联系起来。
可能这是一个简单的问题,但我不确定浮点变量如何存储在内存中以及为什么它会以这种方式运行,有人可以解释一下以下行为。
#include<stdio.h>
int main ()
{
int a = 9/5;
printf("%f\n", a);
return 0;
}
0.000000
我查看了一些关于浮点变量如何存储在内存中的信息,它包含关于尾数、指数和符号的内容。但我不知道如何在这里联系起来。
int a = 9/5;
执行整数除法并忽略余数,因此a
设置为 1。尝试打印 using%f
会产生未定义的行为,但碰巧你0.000000
摆脱了它。
做
double a = 9./5.;
相反,%d
如果整数除法是所需的行为,则打印。(float
也可以,但是当传递给 时a
会被提升到,所以没有理由不使用。)double
printf
double
这是 C 中未定义的行为。使用%d
格式说明符而不是%f
.
printf() 是否取决于格式说明符的顺序?给你详细解答。
这是一种未定义的行为。
您正在使用浮点格式说明符 ( %f
) 来打印 int ( a
)。您应该使用%d
来查看正确的输出。
以下是对您的代码的简要分析:
int a = 9/5; // 9/5 = 1.8, but since you are doing integer division and storing the value in an integer it will store 1.
printf("%f\n", a);//Using incorrect format specifiers with respect to datatypes, will cause undefined behavior
printf("%d\n",a);//This should print 1. And correct.
或者如果你想要浮动:
而不是int
使用float
:
float a=9.0f/5;//This will store 1.800000f
//float a=9/5 will store 1.000000 not, 1.8 because of integer divison
printf("%f\n",a); //This will print 1.800000
另请阅读以下内容:http ://en.wikipedia.org/wiki/IEEE_754-2008 ,了解浮点的工作原理。
关于整数除法的说明:
C99: 6.5.5 乘法运算符
6
当整数被除法时,/
运算符的结果是代数商,其中任何小数部分被丢弃。88)如果商a/b
是可表示的,则表达式(a/b)*b + a%b
应等于a
88)这通常被称为“向零截断”。
仅仅假设您的除法应该导致正常数学的一小部分不会神奇地使它成为浮点数。
int a = 9/5;
你需要使用
float a = 9.0/5;
首先,您需要正确的数据类型,即浮点数(或更好的双精度以获得更高的精度)来存储浮点数。
其次,如果您要对两个整数(即 9 和 5)进行除法,它将简单地遵循整数除法,即仅存储除法的整数部分并丢弃其余部分。为了避免我在 9 之后添加了 .0。这将强制编译器隐式转换为浮点数并进行除法。
关于您提到为什么要打印 0,已经提到在整数上尝试 %f 是未定义的行为。从技术上讲,浮点数是 4 个字节,包含 3 个字节数和 1 个字节指数,它们结合起来生成结果值。