printf("%f\n",5)的输出结果为什么是0.000000
答案:6 悬赏:0 手机版
解决时间 2021-02-28 11:59
- 提问者网友:焚苦与心
- 2021-02-28 05:24
#include
main()
{
printf("%f\n",5);
}
为什么屏幕输出的结果是0.000000,但是如果是(float)5,结果就正确,请详细说明
用cc编译printf("%f\n",5)为什么是0.000000,而不是5.000000,哪方面的问题,编译器、系统,还是说C语言本身就有这个问题,请详细说明原因
最佳答案
- 五星知识达人网友:七十二街
- 2021-02-28 05:33
1,之所以没输出5,这是C语言设计的原因。
2,之所以输出0,这是计算机体系结构的问题。
具体来说:
printf函数不会进行任何类型转换,它只是从内存中读出你所提供的元素的值(按照%d,%f等控制字符提示的格式)。C语言设计中,int类型一般是32bit或者16bit,而float一般是64bit,并且有可能使用科学计数保存。这点就和huhugo88所说一样,5在内存中为00000000,00000101。而且5一般都在静态区,程序的静态存储区默认是0,那么当用%f来读时,就会读64bit,也就是会读之前的很多位0,最后按照(有效数字)×(基数2)pow(指数)的方式来取数,自然结果是0
之所以Vc中不允许这种情况,而有些编译器就允许这么输出就是编译器设置的问题。按理说,这样访问内存是属于越界访问,应该禁止。不过只是读,伤害性不大而已。
全部回答
- 1楼网友:轮獄道
- 2021-02-28 09:32
数据在内存总存储的方式是不同的,
5是一个整数,存储时候最低字节是00000101,其他位都是00000000
浮点数存储的时候是按照有效数字,幂指数来存储的有效数字一般会存储在高字节
现在的情况是有效数字0,指数是5,自然输出的就是0 了
printf("%f\n",7)
的时候,%f这个格式用于输出浮点数,也就是float类型
而7这样的数字,在系统中默认为整型
所以传过去的也是7的整型值,16进制为0x00000007
在printf中,这个整型值会当做浮点数来使用,所以会出错。 具体浮点数存储在不同平台上有不同的实现方式,如果感兴趣可以百度下,不过不建议深究,用处不大
这个是出现问题的原因 解决方法很简单
1. 使用正确的格式 比如printf("%d\n", 7);
2. 如果一定要用%f 那么让系统知道你的7是float型的。 具体的有两种方法
1) printf("%f\n",7.0); 带上小数部分,就默认为浮点型了
2) 强制类型转换 printf("%f", (float)7);
你可以试一下
- 3楼网友:山河有幸埋战骨
- 2021-02-28 07:19
是这样
c中浮点数和整数在内存中的保存方式是不同的,虽然都有4个字节;
整数的5 在内存中是 05 00 00 00 这样4个字节存放的
而浮点数的5在内存中是 00 00 A0 40 这样的4个字节存放的
当你用浮点数的方式去显示整数的5(也就是内存中的 05 00 00 00 这样的4个字节的时候),浮点数种会将 05 00 00 00当作0
虽然表面上看都是5 但浮点数只把 00 00 A0 40这样的4个字节当成5
如果强制转换了,那就会自动转换过去。
不知道我这么解释你明白没
- 4楼网友:孤老序
- 2021-02-28 06:38
这个是输出类型不匹配:
#include
main()
{
printf("%f\n",5); //5为整型,输出要求是浮点型.浮点和整型数存储格式不同,转换格式后低位数据丢失全部变为零.
}
#include
main()
{
printf("%f\n",5.0); //这个就是正确的,5.0为浮点数数据类型匹配
}
- 5楼网友:第四晚心情
- 2021-02-28 05:41
#include
main()
{
printf("%f\n",5);
}
为什么屏幕输出的结果是0.000000,但是如果是(float)5,结果就正确,请详细说明
这个例子可以稍作改动,变为如下,便于对照和理解
#include
int main()
{
float f=5.0;
int n=5;
printf("%f\n",f);
printf("%f\n",n);
return 0;
}
其结果前面一个是正确的,后面一个是0.000000
f的地址分配在0x0012ff78,其内容是0x05 0x00 0x00 0x00
n的地址分配在0x0012ff7c,其内容是0x00 0x00 0xA0 0x40
printf("%f\n",f); 对应的汇编指令如下:
0040EA1D fld dword ptr [ebp-4]
0040EA20 sub esp,8
0040EA23 fstp qword ptr [esp]
0040EA26 push offset string "%f\n" (00425030)
0040EA2B call printf (004010a0)
0040EA30 add esp,0Ch
printf("%f\n",n);对应的汇编指令如下:
0040EA0C mov eax,dword ptr [ebp-8]
0040EA0F push eax
0040EA10 push offset string "%f\n" (00425030)
0040EA15 call printf (004010a0)
0040EA1A add esp,8
可以看出,n和f虽然都是5,其类型不同后,在内存中对应的内容是不一样的
而printf()函数,也会根据不同的参数,使用不同的处理
问题补充:用cc编译printf("%f\n",5)为什么是0.000000,而不是5.000000,哪方面的问题,编译器、操作系统、CPU,还是说C语言本身就有这个问题,请详细说明原因
我觉得,这个不能算问题,C语言本身也没有规定的这么细致。
编译器并不知道5是float类型还是int类型,只能按int类型去理解
“”引号串里面的%d,%f,到执行printf()这个函数的时候,才去对后面的数进行理解
一般情况下C语言会进行自动的数据转换,如果是5.0,本身已经是float了,就不会有这个问题,是不是C语言在printf的时候不进行数据类型的转换?
另外:
printf("%f,%f\n",5,5.0);输出结果是0.000000,0.000000
printf("%f,%f\n",5.0,5);输出结果是5.000000,0.000000
这个又是什么原因
printf("%f,%f\n",5,5.0);汇编为:
0040EA22 push 40140000h
0040EA27 push 0
0040EA29 push 5
0040EA2B push offset string "%f\n" (00425030)
0040EA30 call printf (004010a0)
0040EA35 add esp,10h
printf("%f,%f\n",5.0,5);对应的汇编为:
0040EA38 push 5
0040EA3A push 40140000h
0040EA3F push 0
0040EA41 push offset string "%f\n" (00425030)
0040EA46 call printf (004010a0)
0040EA4B add esp,10h
printf("%f,%f\n",5,5.0);输出结果是0.000000,0.000000
第一个参数是整数5,其实是不对的,但函数printf()并没认为它的类型是错的
并且导致了后面那个参数也出错了
printf("%f,%f\n",5.0,5);输出结果是5.000000,0.000000
第一个参数是浮点形,输出也正确
第二个参数跟上面printf("%f\n",5);结果是0.000000 的情况一样
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯