能力值:
( LV4,RANK:40 )
|
-
-
2 楼
#include <stdio.h> void main() { int a=15; printf("a=%d",a); } 结果是0.000000 为什么??结果是这个?请大家解释一下。
怎么可能是 0.0000
|
能力值:
( LV3,RANK:20 )
|
-
-
3 楼
我编译后的结果就是这个。没办法啊。太不懂了!
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
lz忽悠人啊?怎么可能是一串0.重新编译下。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
我都试了3次了,都是15,你的可能是0?
你用的什么编辑器?你关了再试试
|
能力值:
( LV3,RANK:20 )
|
-
-
6 楼
错了。。
不好意思。我改过来了!
|
能力值:
( LV3,RANK:20 )
|
-
-
7 楼
我用的是vc++6.0
|
能力值:
( LV6,RANK:90 )
|
-
-
8 楼
第一个是这样的:内存中:
0F 00 00 00
转换成float的表示法就是(bin)
000 ... 00 1111
对应的浮点数应该 = 1.000... * 2 ^ -128
这么小的数,前几位为0是很正常的,这是一个解释,其实或者和3 4 情况一样,是参数问题
第二个和第一个会没有什么区别,赋值的时候就转换了
第三个和第四个和printf的参数传递机制有关,我就不太清楚了
如果你需要正确的看内存中的情况,可以用:
#include <stdio.h>
int main()
{
float a=15.0;
int *u = (int*)&a;
printf("a=%d", *u);
}
|
能力值:
( LV7,RANK:100 )
|
-
-
9 楼
#include <stdio.h>
void main()
{
float a=15;
printf("a=%d",a);
}
为什么这个的结果是a=0;
这个是因为在这个函数printf("a=%d",a); 调用的时候向栈中压入四个字节... 但 float a=15; a是8字节大小, 压栈的时候将高位4个字节压入, 也0... 所以输出为0
|
能力值:
( LV6,RANK:90 )
|
-
-
10 楼
float是4个字节吧你可以输出sizeof(float)试试就知,我估计是不是float都会转换成double压栈
|
能力值:
( LV3,RANK:20 )
|
-
-
11 楼
楼上正解,由于printf是可变参数,而且只有第一个参数定义了类型,其余参数可选,也就无类型,这种情况下浮点都转成double,8位/16位整数转成32位整数。
|
能力值:
( LV7,RANK:100 )
|
-
-
12 楼
楼上正解...
#include <stdio.h>
void main()
{
float a = 15;
printf("sizeof int = %d; sizeof float = %d\n", sizeof(int), sizeof(float));
printf("a = %f, a = %e\n", a, a);
printf("a=%d\n",a);
}
输出结果:
a = 15.000000, a = 1.500000e+001
a = 0
反汇编后的代码如下:
0041099F fld dword ptr [ebp-4]
004109A2 sub esp,8
004109A5 fstp qword ptr [esp]
004109A8 push offset string "a=%d\n" (0042601c)
004109AD call printf (00401080)
|
能力值:
( LV3,RANK:20 )
|
-
-
13 楼
谢谢大家的帮助!
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
感觉printf这个函数有很多东西都不是很清楚呢,正常用会用,一旦出现点问题,就感觉莫名其妙的,学习了~
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
看下 汇编就知道了
学习了~
|
能力值:
( LV7,RANK:100 )
|
-
-
16 楼
俺一开始看的就是反汇编出来的代码... 哪知竟然是用到了协处理器... 没整明白... 还得加把油了...
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
我也是新手 帮不了你啊
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
我来看你了哦
|
|
|