我在项目中看到了这段代码.
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位编译.
有趣的是推测将对"地址的一部分"值做什么.