2013-03-25 36 views
0

我跑这些代码,但我有一个非常奇怪的数字。我是新的C++我不明白为什么这些数字出来的方式,他们在c + +

ⅱ)预测的码如下片段的输出:用于第一个我得到X

一个)

int x=75, y=105; 
printf(" %c %lf " , x,y); 

等于K.此我明白 但是我得到0,是因为它被声明为int而不是double?

B)

float pH=5.65582; 
printf (" %d %lf" , pH,pH); 

现在这个人是太奇怪了。对于第一个pH值是1073741824.我甚至不知道他们是如何得到它的。第二个pH值是2.怎么样? C)

float p=0.345689; 
double q=0.445566778899; 
printf ("%d %f %lf" , p*q, p*q, p/q); 
printf ("%d %0.5f %9.3f", p+q , p-q, p*(p+q)); 

p×q个-1713662420

p×q个-0.000000

P/Q -0.000000

P + Q -1561213759

PQ 0

p *(p + q)确实很长的数字

5918904964504337400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000

我做错了什么?

+0

[这](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)可能有点相关.... – Recker 2013-03-25 19:21:33

+0

我认为''1073741824''实际上应该是对浮点数“5.65582”的内部表示的直接解释。 – gongzhitaao 2013-03-25 19:22:37

+1

由于'iostream'受到了诽谤,这是'std :: cout'应该用在'printf'上的一个主要例子,至少直到过去出现了简单的学习错误。 – 2013-03-25 19:30:38

回答

4

对于传递的参数类型,您正在使用错误的printf格式说明符。

要打印floatdouble值,使用"%f""%g",或者"%e",或一些变种。对于int参数,请使用"%d"

通过使用特定的格式字符串,你有希望传递正确类型的参数。如果你没有这样做,你说谎到printf,结果行为是未定义的。不要这样做。

(什么是可能发生的是,例如,printf走的是int参数,你实际上给它的代表性,并假设这是一个double对象的代表性,但不要浪费时间弄清楚为什么你得到了你所做的结果,只需修复代码。)

+0

1073741824是'5.65582'的低32位,-1713662420是'p * q'的低32位。我没有看到-1561213759的匹配项。 – 2013-03-25 19:33:05

+0

你有吗?事实上它是未定义的行为应该表明你发现的模式并不总是成立。 – chris 2013-03-25 19:33:52

+1

@chris:不,你不必找到一个匹配。但有时候,人们通过关注窗帘来学习东西。 – 2013-03-25 19:35:16

1

doublefloatint的实际表示在机器内部非常不同。 printf中不正确的格式说明符将尝试解释此特定类型的二进制表示。

在垃圾 - 垃圾出

+1

'float'和'double'表示之间的区别在这里是不相关的; 'float'参数被提升为'double'。问题是OP是混合整数和浮点。 – 2013-03-25 19:24:04

+0

@KeithThompson是的,我也打算在混合中加入int。我忘了= P – 2013-03-25 19:26:17

+0

但我得到了确切的代码,并写下我期望的输出。我的答案是可以接受的,或者我在这里错过了什么? – 2013-03-25 19:37:52