我在项目中看到了这段代码。
b
的类型是void*
:
void *b = ...;
int a = (int) (unsigned long) b;
这条线毫无意义吗?我的意思是,这与a = (int) b
在所有情况下?
这可能会避免 64 位 Unix 系统上的编译器警告unsigned long
是一个 64 位数量,因此足够大以容纳指针,但是int
是一个 32 位量,不足以容纳指针。演员阵容(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]
$
在 Mac OS X 10.8.4 上使用 GCC 4.7.1,默认为 64 位编译。
推测将如何处理“地址的一部分”值是很有趣的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)