reinterpret_cast转换后的数据应该是什么样的呢?

  1. 为什么257经过reinterpret_cast转换后的输出是1、1、0、0而不是255、2、0、0呢?
  2. reinterpret_cast转换后的内存结构是什么样的呢? 也是占4个字节吗?但是模板参数用的是<unsigned char*>,也就是1个字节。
  int32_t data_size = 257;
  unsigned char* head = reinterpret_cast<unsigned char*>(&data_size);
  for (int i = 0; i < 4; i++) {
    unsigned int c = head[i];
    printf("%d\n", c); //输出:1、1、0、0
  }
阅读 2.2k
2 个回答

reinterprete_cast 直观理解就是,重新解释内存。它是不修改内存的内容的,只是按照另外一种方式解释内存中的内容。

257 是 0x101,或者可以写成 0x 00 00 01 01 。在占四个字节,四个字节的内容分别是 0x00 0x00 0x01 0x01 ,也就是 0 0 1 1 。不同的环境里,这四个字节的顺序是不一样(可以搜索内存大小端)。所以输出 1, 1, 0, 0 是没有问题的,这个环境显然是小端的。


重新解释内存就带来一个问题,C++ 是不规定内存如何存储的,而且实际上内存表示在不同环境确实可以是不一致的,比如上面的内存大小端的问题。于是这个程序的最终执行结果,实际是不确定的。

257 = 0x101 这个是 1,1,0,0
767 = 0x2ff 这个是 255,2,0,0

在小端序的机器上,结果就是 1,1,0,0
在大端序的机器上,结果就是 0,0,1,1
这是确定的,你自己判断是小端还是大端就好了。

reinterpret 是“重新解释”的意思,C++ 已经明确说明了 reinterpret_cast 是一种危险的转换,你需要自己了解转换的后果,语言本身不保证跨平台兼容。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题