在同一条线上投两次

Buf*_*lls 14 c casting

我在项目中看到了这段代码.

b的类型是void*:

void *b = ...;
int a = (int) (unsigned long) b;
Run Code Online (Sandbox Code Playgroud)

这条线是没有意义的吗?我的意思是,它和a = (int) b所有情况一样吗?

Jon*_*ler 22

这可能避免了64位Unix系统上的编译器警告,其中unsigned long64位数量因此大到足以容纳指针,但是int32位数量不足以容纳指针.演员来(unsigned long)保留地址的所有位; 后续的强制转换int会丢弃地址的高位32位,但默认情况下不会收到警告.

展示:

int main(void)
{
    void *b = (void *)0x12345678;
    int   a = (int)(unsigned long)b;
    int   c = (int)b;
    return a + c;
}

$ gcc -O3 -g -std=c99 -Wall -Wextra -c ar.c
ar.c: In function ‘main’:
ar.c:5:15: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
$
Run Code Online (Sandbox Code Playgroud)

在Mac OS X 10.8.4上使用GCC 4.7.1,默认为64位编译.

有趣的是推测将对"地址的一部分"值做什么.

  • 请注意,创意人隐藏`void*`s :)中的数字(或布尔)信息 (2认同)