zoukankan      html  css  js  c++  java
  • 对偏移表达式的 思考过程—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

  • 相关阅读:
    mysql 触发器 插入
    【经验】STL的list vector在iterator迭代器的循环中 使用erase 造成的BUG
    C/C++ 关于 for循环 的第二个表达式右侧非常量的时候
    MySQL C API的一个让我头疼的问题,获得一行记录中包括NULL
    vim粘贴代码的时候,恶心的缩进.
    [转]分析MySQL数据类型的长度【mysql数据字段 中length和decimals的作用!熟悉mysql必看】
    [转]对于孩子:旅行的意义何在?
    libc中的标准函数 localtime和localtime_r 的用法
    【腾讯面试题目】非循环方式 计算一个32位整数中被置1的位数
    C++对带有分隔符的字符串 分割为数字的通用解决方案
  • 原文地址:https://www.cnblogs.com/titer1/p/2411219.html
Copyright © 2011-2022 走看看