reinterpret_cast<const unsigned char*>语义及代码行为问询
关于
reinterpret_cast<const unsigned char*>的行为规则 是的,C++标准明确规定了这种行为是合法且具有确定定义的,核心规则分为两部分:
1. 通过unsigned char*访问对象的合法性
C++标准允许将任何对象的指针转换为unsigned char*(或const unsigned char*),并且通过该指针读取对象的对象表示(即组成对象的底层字节序列)是严格别名规则的例外情况,完全合法,不会触发未定义行为。
在你的代码中,reinterpret_cast<const unsigned char*>(&x)指向了int x的第一个字节,解引用它得到的就是x对象表示的第一个unsigned char值。
2. unsigned char到bool的转换规则
当把unsigned char类型的值赋值给bool变量时,C++标准有明确规定:
- 若源值为0,转换结果为
false(对应数值0) - 若源值不为0,转换结果为
true(对应数值1)
这正是你看到汇编中test al, al(检查字节值是否为0)和setne al(非0时设置为1)的原因——编译器严格按照标准规则生成代码,确保非0字节值转为1,0值保持0。
对比未定义行为的情况
代码中static_cast<bool*>(w)并解引用的行为属于未定义行为:w指向的是int对象,直接将其转换为bool*后解引用违反了严格别名规则,所以不同优化等级下编译器可以生成任意结果,这也是输出不一致的根源。
内容的提问来源于stack exchange,提问作者byrnesj1
相关产品推荐
相关产品推荐

