对偏移表达式的 思考过程—how offset macro is think out

      /* 小结:

      品味取成员的偏移,不是支取偏移,不是先取偏移再成员。

      不能对常量取& 的解决。

      指针运算的前提。某某指针不能转换为另一个指针

      解决宏的方法。先一个表达式一个表达式的测试,再转化为宏。

      最后,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;

}

image

原文地址:https://www.cnblogs.com/titer1/p/2411219.html