reinterpret_cast的C等价物是多少?

35 c

reinterpret_cast来自C++ 的C等价物是多少?

Cra*_*rks 33

int *foo;
float *bar;

// c++ style:
foo = reinterpret_cast< int * >(bar);

// c style:
foo = (int *)(bar);
Run Code Online (Sandbox Code Playgroud)

  • 还请注意litb在对原始问题的评论中非常好的观点. (4认同)

Gav*_*ith 6

如果可以获取值的地址,一种方法是将指向它的指针强制转换为指向不同类型的指针,然后取消引用该指针。

例如,一个浮点到整数的转换:

int main()
{
  float f = 1.0f;

  printf ("f is %f\n", f);
  printf ("(int) f is %d\n", (int)f);
  printf ("f as an unsigned int:%x\n", *(unsigned int *)&f);
}
Run Code Online (Sandbox Code Playgroud)

输出:

f is 1.000000
(int) f is 1
f as an unsigned int:3f800000
Run Code Online (Sandbox Code Playgroud)

请注意,C 标准可能无法保证这会起作用。无论如何,您不能使用 reinterpret_cast 从 float 转换为 int,但对于受支持的类型(例如,在不同的指针类型之间),这将是相似的。

无论如何,让我们确认上面的输出是有道理的。

http://en.wikipedia.org/wiki/Single_precision_floating-point_format#IEEE_754_single-precision_binary_floating-point_format:_binary32

二进制的最后一个答案:

0011 1111 1000 0000 0000 0000 0000 0000

这是 IEEE-754 浮点格式:符号位 0,后跟 8 位指数 (011 1111 1),后跟 23 位尾数(全为零)。

要解释指数,请减去 127:01111111b = 127,并且 127 - 127 = 0。指数为 0。

要解释尾数,请将其写在 1 后跟小数点:1.00000000000000000000000(23 个零)。这是十进制的 1。

因此,正如我们预期的那样,十六进制 3f800000 表示的值是 1 * 2^0 = 1。