首页
社区
课程
招聘
一个简单的c语言的东东。很急!
发表于: 2010-3-4 22:43 5489

一个简单的c语言的东东。很急!

2010-3-4 22:43
5489
请求帮助啊,这个东西很简单。希望大家能帮助我
请写明为什么编译后为什么是那种结果?

#include <stdio.h>
void main()
{
        int a=15;
        printf("a=%f",a);
       
}
为什么会跳错?请大家解释一下。

#include <stdio.h>
void main()
{
        int a=15.0;
        printf("a=%f",a);
}

这个也是报错!

#include <stdio.h>
void main()
{
        float a=15.0;
        printf("a=%d",a);
}

为什么这个的结果是a=0  ?

#include <stdio.h>
void main()
{
        float a=15;
        printf("a=%d",a);
}

为什么这个的结果是a=0;

请大家一一说明一下,为什么会这样?

我是新人,困在这里好久了!

谢谢大家的帮助!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 142
活跃值: (310)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
#include <stdio.h>
void main()
{
int a=15;
printf("a=%d",a);

}
结果是0.000000 为什么??结果是这个?请大家解释一下。

怎么可能是 0.0000
2010-3-4 22:45
0
雪    币: 160
活跃值: (56)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
我编译后的结果就是这个。没办法啊。太不懂了!
2010-3-4 22:46
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
lz忽悠人啊?怎么可能是一串0.重新编译下。
2010-3-4 22:55
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我都试了3次了,都是15,你的可能是0?
你用的什么编辑器?你关了再试试
2010-3-4 22:57
0
雪    币: 160
活跃值: (56)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
错了。。
不好意思。我改过来了!
2010-3-4 22:57
0
雪    币: 160
活跃值: (56)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
我用的是vc++6.0
2010-3-4 22:58
0
雪    币: 424
活跃值: (10)
能力值: ( 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);
}
2010-3-4 23:08
0
雪    币: 173
活跃值: (132)
能力值: ( 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
2010-3-4 23:58
0
雪    币: 424
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
10
float是4个字节吧你可以输出sizeof(float)试试就知,我估计是不是float都会转换成double压栈
2010-3-5 09:50
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
楼上正解,由于printf是可变参数,而且只有第一个参数定义了类型,其余参数可选,也就无类型,这种情况下浮点都转成double,8位/16位整数转成32位整数。
2010-3-5 11:00
0
雪    币: 173
活跃值: (132)
能力值: ( 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)
2010-3-5 11:03
0
雪    币: 160
活跃值: (56)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
谢谢大家的帮助!
2010-3-5 18:23
0
雪    币: 56
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
感觉printf这个函数有很多东西都不是很清楚呢,正常用会用,一旦出现点问题,就感觉莫名其妙的,学习了~
2010-3-5 18:32
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
看下 汇编就知道了
学习了~
2010-3-5 19:30
0
雪    币: 173
活跃值: (132)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
16
俺一开始看的就是反汇编出来的代码... 哪知竟然是用到了协处理器... 没整明白... 还得加把油了...
2010-3-5 23:29
0
雪    币: 97
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
我也是新手 帮不了你啊
2010-3-6 21:04
0
雪    币: 6
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
我来看你了哦
2010-4-17 13:04
0
游客
登录 | 注册 方可回帖
返回
//