【发布时间】:2018-09-28 14:52:50
【问题描述】:
我有一个包含相同类型成员的结构。我正在尝试将其转换为 uint8_t 类型。我能够做到这一点,但看不到输出,请告诉我哪里出错了。我也知道还有其他方法可以做到吗?我想这样做是因为我想习惯static_cast 和reinterpret_cast。
代码如下:
int main()
{
struct xs{
bool x :1 ;
bool y :1;
bool z :1;
uint8_t num :5;
} zs;
uint8_t* P = static_cast<uint8_t*>(static_cast<void*>(&zs));
cout << *P << endl;
return 0;
}
【问题讨论】:
-
您对
uint8_t实际上是unsigned char的恼人事实感到不满,因此将被打印为一些 ascii 字符 - 很可能不可见。将其转换为其他整数类型。但是请记住,您正在做的事情(将类型视为不是的东西)是可怕的Undefined Behaviour,无法保证会发生什么。 -
@BoBTFish 用 char 类型试过还是没有输出
-
正如@BoBTFish 所说,这是未定义的行为。
struct xs的大小和布局是实现定义的,可能不是uint8_t的大小。即使是这样,你的演员所做的也被定义为不起作用。请参阅注释:en.cppreference.com/w/cpp/language/bit_field -
只是一个警告:也许“习惯”重新解释演员表不是最好的主意。 reinterpret casts 用于特殊情况,不应该经常使用,实际上它们是危险信号,表明正在发生一些奇怪的事情。
标签: c++ c++11 visual-c++ bit-fields reinterpret-cast