/* 小结:
品味取成员的偏移,不是支取偏移,不是先取偏移再成员。
不能对常量取& 的解决。
指针运算的前提。某某指针不能转换为另一个指针
解决宏的方法。先一个表达式一个表达式的测试,再转化为宏。
最后,hxf总结出来的一般性原则,,任意地址,任意对象。。使用只不过是个geek
*/
/************************************************************************/
/************************************************************************/
/* 对偏移的宏 由来的 思考 */
/************************************************************************/
typedef struct z
{
int a;
double b;
long c;
} myZ;
void test_偏移宏的变迁(){
cout<<& ( ( myZ *)0 )->b ;// test for cool
cout<<endl;
cout<<& ( (myZ *) ( (void *) 0) )->b; // 多加括号,包括强制转换符号
cout<<endl;
//
//
cout<<"reay for void *"<<endl;
& ( (myZ *) ( (void *) 0x1234) )->b; // 多加括号,包括强制转换符号
& ( (myZ *) ( (void *) 0x987600000) )->b; // 多加括号,包括强制转换符号
cout<< & ( (myZ *) ( (void *) 0x9876) )->b;
cout<<endl;
cout<< & ( (myZ *) ( (void *) 0x9876) )->a;
cout<<endl;
// cout<< & ( (myZ *) ( (void *) 0x9876) ) 单独报错误
//
//后面加了->a
cout<<"验证任意的, one is 0x987600000 ; one is void * 0 ; one is just 0 ;one is for 0x123456789 …. "<<endl;
cout<< ( (unsigned int) & ( (myZ *) ( (void *) 0x987600000) )->b - (unsigned int) & ( (myZ *) ( (void *) 0x987600000) ) ->a );
cout<<endl;
cout<< ( (unsigned int) & ( (myZ *) ( (void *) 0) )->b - (unsigned int) & ( (myZ *) ( (void *) 0) ) ->a );
cout<<endl;
cout<< ( (unsigned int) & ( (myZ *) ( 0) )->b - (unsigned int) & ( (myZ *) ( 0) ) ->a );
cout<<endl;
//扩展
cout<< ( (unsigned int) & ( (myZ *) ( 0x123456789) )->b - (unsigned int) & ( (myZ *) ( 0x123456789) ) ->a );
cout<<endl;
cout<< ( (unsigned int) & ( (myZ *) ( -1) )->b - (unsigned int) & ( (myZ *) ( -1) ) ->a );
cout<<endl;
cout<< ( (unsigned int) & ( (myZ *) ( 1>>32) )->b - (unsigned int) & ( (myZ *) ( 1>>32) ) ->a );
cout<<endl;
cout<< ( (unsigned int) & ( (myZ *) ( 1>>64) )->b - (unsigned int) & ( (myZ *) ( 1>>64) ) ->a );
cout<<endl;
cout<< ( (unsigned int) & ( (myZ *) ( 1>>65) )->b - (unsigned int) & ( (myZ *) ( 1>>65) ) ->a );
cout<<endl;//我的机器位,看来已经溢出了。
/************************************************************************/
}
int _tmain(int argc, _TCHAR* argv[]){
test_偏移宏的变迁();
getchar();
return 0;
}