2010-07-09 17 views
0

將float轉換爲int時,編譯器如何實現此轉換。 編譯器是否屏蔽了浮點變量的某些內存部分,即編譯器將哪部分內存插入,以便將其餘部分傳遞給int變量。嘗試瞭解編譯器如何執行轉換/轉換,例如,當從float轉換爲int時

我想這個問題的答案在於如何在內存中維護int和float。

但不是依賴於機器而是依賴於編譯器。編譯器如何確定在轉換爲較低類型時複製哪部分內存(這是一個靜態轉換,右)。

我有點困惑於一些錯誤的信息,我猜。我讀了關於tag = downcasting的一些問題,關於它是一個演員還是一個轉換的爭論正在進行,我對它的調用並不是很感興趣,因爲兩者都是由編譯器執行的,但是在這是如何執行的)。

... 感謝

+0

你指的是哪種編程語言? – adamk 2010-07-09 19:21:03

+0

你可以採用C++,但是它是否會與c或C++的行爲做任何差異。 (如果你沒有指定任何其他的lang,除了c/C++) – saurabh 2010-07-09 19:52:04

回答

0

在談到基本類型,而不是指針,則轉換完成。因爲浮點和整數表示有很大不同(通常分別是IEEE-754和2的補碼),所以它不僅僅掩蓋了一些位。

如果你想看到表示爲int的浮點數而不做一個轉換,你可以做這樣的事情(在C):

float f = 10.5; 
int i2 = (int*)&f; 
printf("%f %d\n", f, i2); 
+0

*(int *)&f'表達式有未定義的結果,因爲它違反了C的指針別名規則。最近版本的gcc通常無法正常工作。請參閱這篇文章,瞭解別名的正確方法和正確操作方法(內容大多不針對Cell,儘管它位於面向Cell的站點上):http://cellperformance.beyond3d.com/articles/ 2006/06 /諒解-strict-aliasing.html – 2010-07-09 19:51:48

+0

好點。無論如何,使用聯合(在C/C++中)可能是重新解釋位的正確答案。但無論如何,這是無用的事情,所以我希望這個問題僅僅是學術問題!但是對於原始問題,這是在討論整數和浮點數時發生的轉換(改變位模式)。 – 2010-07-09 23:06:38

+0

是的,如問題本身所述,僅用於理解目的。無論如何,你的答案幫助。謝謝 – saurabh 2010-07-10 07:18:15