2013-03-25 17 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

相關問題