Re: [問題] printf變數型態問題

看板C_and_CPP作者 (骨傲風清(掛網))時間13年前 (2012/07/05 01:02), 編輯推噓2(207)
留言9則, 4人參與, 最新討論串2/2 (看更多)
※ 引述《smallstrong2 (小強)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : GCC : 問題(Question): : #include <stdio.h> : int main(void) { : int a=5; : float b=5; : printf("%f\t%d\n", a/2,a/2); : printf("%f\n",a/2); : printf("%d\n"a/2); : printf("%f\t%d\n", b/2,b/2); : printf("%f\n",b/2); : printf("%d\n",b/2); : } : (1)為什麼發亮的地方是0??? 黃色的地方會為 0 ,都是型別錯誤的原因。 : (2)為什麼順序的不同會造成結果不同?? 我猜你所謂的亂數指的應該是 4199093 這個部分, (請見最下面的推文) 這其實也是和型別有關,由於 float 佔 8位元, 因此當 int 的 a 做完運算後還是 int , 他的大小也是只有 4 位元,可是以 float 下去讀將取 8 位元, 因此也導致了後面的錯誤。 : [output] : 0.000000 4199093(亂數) : 0.000000 : 2 : 2.500000 0 : 2.500000 : 0 -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.217.21.138

07/05 02:04, , 1F
問題二其實你只回對了一半
07/05 02:04, 1F

07/05 02:05, , 2F
8 byte 的浮點數叫做 double 但這裡雖然 b/2 結果是 float
07/05 02:05, 2F

07/05 02:05, , 3F
在推入 printf 這種變長參數時會全部變成 double 再推
07/05 02:05, 3F

07/05 02:06, , 4F
所以並不是因為 float 有 8 byte (它只有 4 byte!)
07/05 02:06, 4F

07/05 02:06, , 5F
而是因為推進 printf 時變成了 8 byte 長的 double
07/05 02:06, 5F
感謝指證!

07/05 04:30, , 6F
啥, va arg 才不會把 b/2 轉 float 勒
07/05 04:30, 6F

07/05 04:31, , 7F
看太快沒仔細看程式碼 請略過XDDDD
07/05 04:31, 7F

07/05 07:33, , 8F
真的要選目前流行的機器還要考慮 alignment xD
07/05 07:33, 8F
※ 編輯: cleanwind 來自: 120.101.9.24 (07/05 08:12)

07/05 14:28, , 9F
感謝專業解答
07/05 14:28, 9F
文章代碼(AID): #1Fz7S82- (C_and_CPP)
文章代碼(AID): #1Fz7S82- (C_and_CPP)