如何使用Obj-C进行reinterpret_cast?

时间:2016-11-29 12:49:51

标签: objective-c

编辑:我在Objective-C中寻找reinterpret_cast,因此以下对我的预期问题毫无意义。

  

Objective-C中是否存在静态强制转换?

     

e.g。在这个C ++示例中使用static_cast是有充分理由的:

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

我可以考虑使用union或指针来直接访问   整数值作为一个浮点数,但这将使代码更多   复杂。

     

我如何方便地在C ++示例中执行相同的操作   目标C?

2 个答案:

答案 0 :(得分:2)

目标C是C的超集,所以这样做C方式和简单的演员

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

答案 1 :(得分:0)

在澄清之后,您在reinterpret_cast之后:

你是对的,你可以使用union来做到这一点。如果你想内联,你可以使用强制转换,地址和间接......

(Objective-)C和C ++中的C风格演员(type)expr的工作方式类似:如果static_cast的等价物是合适的,那么它就是这样的,例如在intfloat之间以及其他值类型;否则它将相当于reinterpret_cast,例如在指针类型之间。

所以你只需要转换为指针,强制转换和间接转换。 E.g:

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