- 为什么257经过reinterpret_cast转换后的输出是1、1、0、0而不是255、2、0、0呢?
- 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
}
reinterprete_cast 直观理解就是,重新解释内存。它是不修改内存的内容的,只是按照另外一种方式解释内存中的内容。
257 是 0x101,或者可以写成 0x 00 00 01 01 。在占四个字节,四个字节的内容分别是 0x00 0x00 0x01 0x01 ,也就是 0 0 1 1 。不同的环境里,这四个字节的顺序是不一样(可以搜索内存大小端)。所以输出 1, 1, 0, 0 是没有问题的,这个环境显然是小端的。
重新解释内存就带来一个问题,C++ 是不规定内存如何存储的,而且实际上内存表示在不同环境确实可以是不一致的,比如上面的内存大小端的问题。于是这个程序的最终执行结果,实际是不确定的。