将 void* 与 uint16_t 进行比较

compare void* with uint16_t

本文关键字:比较 uint16 void      更新时间:2023-10-16

在一些遗留代码中,它在GCC 4.6(带有-fpermissive)上编译良好,我有这个:

uint16_t a = 0;
void* b = ...;
if(b == a) // ...

这种比较在GCC 4.6上是否得到了很好的定义?是向下转换为 16 位还是向上转换为 32/64 位?

看起来它向上转换 16 位整数以匹配指针大小。运行以下代码输出"upcast"

uint16_t a = 1;
void* b = (void*)0x10001;
(b == a) ? printf("downcast") : printf("upcast");

虽然这在 C++11 标准(N3337 草案)中没有明确写成,但我能够想出这个(强调我的)。

§5.9 关系运算符

可以比较指向相同类型的对象或函数的指针(指针转换后),结果定义如下

— 如果两个指针...

— 如果两个指针...

— 如果两个指针...

— 如果两个指针...

— 如果两个指针...

未指定其他指针比较。

现在是平等部分:

§5.10 相等运算符

==(等于)和

!=(不等于)运算符与关系运算符具有相同的语义限制、转换和结果类型,只是它们的优先级和真值结果较低。

通过这一点,我认为这种比较是没有具体说明的。

它可以编译也可能不编译(不确定,这取决于编译器和编译器选项)在任何情况下,演员阵容都将像以下方式进行:

if( b == (void*)a )
{
}

请注意,上转换/向下转换不是正确的用词,因为它与类相关,在本例中只是类型转换。