我有以下代码:
#include <iostream>
void f(void* buffer) {
int x = static_cast<bool>(*(char*)buffer);
int y = static_cast<bool>(*(bool*)buffer);
std::cout << x << " " << y;
}
int main() {
int a = 255;
f(&a);
}
在GCC 9.1上,我得到以下输出:
1 255
为什么将具有bool
强制转换结果(char*)
的{{1}}强制转换为1,而将具有x
强制转换结果bool
的强制转换为(bool*)
在这种情况下为255?
答案 0 :(得分:5)
为什么用(bool *)强制转换为bool ...?
因为程序的行为是不确定的。
标准说(引用最新草案):
[basic.lval]
如果程序尝试通过glvalue访问对象的存储值,该glvalue的类型与以下类型之一不相似([conv.qual])行为未定义:>
- 对象的动态类型,
- 一种类型,它是与对象的动态类型相对应的有符号或无符号类型,或者
- char,unsigned char或std :: byte类型。
bool
与buffer
的动态类型不相似,它既不是unsigned
也不是unsigned
的对应类型,也不是char
{{1} }或unsigned char
。因此行为是不确定的。
为什么将(char *)强制转换为布尔值将x设为1
因为std::byte
的第一个字节包含一个不代表零的值。是否会这样取决于CPU体系结构。整数的字节顺序由实现定义。
请注意,在这种情况下,行为将得到很好的定义,因为在引用的规则中,a
被列为例外之一。
答案 1 :(得分:1)
您需要使用exestr
。例如
reinterpret_cast<int *>
这是一个演示程序
int y = static_cast<bool>(*reinterpret_cast<int*>( buffer ));