2016-11-29 65 views
0

編輯:我正在尋找Objective-C中的reinterpret_cast,因此以下對我的預期問題沒有意義。如何用Obj-C做一個reinterpret_cast?

Objective-C中是否存在靜態轉換?

例如在這個C++例子static_cast用於一個很好的理由:

float rnd = static_cast <float> (rand())/static_cast <float> (RAND_MAX); 

我能想到用union或指針直接訪問 整數值的單精度浮點但是這將使得代碼更 複雜。

我該如何在C++示例中方便地在 Objective-C中執行相同的操作?

+0

一個'union'不執行靜態澆鑄轉換你的'float'成'int'。 – Gerard

+1

你可以寫'static_cast',但是你對'union'的評論意味着你可能會想'reinterpret_cast'。你能澄清並陳述你認爲你的表達的語義是什麼嗎? – CRD

+0

你說得對,我在找'reinterpret_cast'。我對這種誤解感到抱歉。 – KugelnMMXVI

回答

0

後你reinterpret_cast後:

你是正確的,你可以用做union。如果你想這樣做內聯,你可以使用強制轉換,地址和間接...

C風格的兩個(Objective-)C和C++投(type)expr工作方式類似:如果static_cast相當於是它適合它,例如在intfloat之間以及其他值類型;否則它將執行等效的reinterpret_cast,例如,在指針類型之間。

所以你只需要轉換爲指針,轉換和間接。例如:

int z = 0xDEADBEEF; 
float y = *(float *)&z; 
NSLog(@"%d -> %f", z, y); 

是的,它是一個有點醜,但隨後你在做什麼是以及;-)爲了使它更好一點把它定義爲一個宏:

#define REINTERPRET(type, expr) (*(type *)&(expr)) 

,您可以使用作爲:

int z = 0xDEADBEEF; 
float y = REINTERPRET(float, z); 
NSLog(@"%d -> %f", z, y); 

reinterpret_cast一樣,您應該謹慎使用,小心!

HTH

+0

非常感謝。由於這個功能似乎不能直接在Objective-C中實現,所以我的解決方案是最好的。 – KugelnMMXVI

2

目標C是C的超所以做此澄清的C方式和簡單的鑄件

float rnd = (float) (rand())/(float)(RAND_MAX); 
+0

這是工作,但它不是做同樣的事情。 – KugelnMMXVI

+0

@KugelnMMXVI - 它以什麼方式不做同樣的事情? – CRD

+1

我不認爲你需要那麼多演員。'(float)(rand())/(RAND_MAX)'應該按照預期工作。 – JAL