V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
banxi1988
V2EX  ›  程序员

类型与强制类型转换:感想 1

  •  
  •   banxi1988 ·
    banxi1988 · 2017-02-21 00:00:36 +08:00 · 2236 次点击
    这是一个创建于 2836 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近突然对类型转换多了一些理解. 这些理解如果用一句话来总结就是: 类型即协议. 一个类型就是一个如何存取数据的协议. 而类型的转换,则是说明数据读取的协议转换成另一个适用的协议. 对 C 语言来说,数据类型则是针对内存布局的协议. 下面以 C 语言为例.

    1. 如下所例,虽然 Age 是一个结构, 但是其内存布局只是一个 int 类型的数据布局而已.所以完全可以直接使用 int 数据类型存取协议来操作这个 age 结构. 如下:

      typedef struct Age{
          int age;
      } Age;
      
      int main(int argc, const char * argv[]) {
          Age age = { 3 };
          int *age2 = (int *)&age;
          printf("age2=%d\n", *age2); // age2=3
          *age2 = 5;
          printf("age.age=%d\n", age.age);// age.age=5
          return 0;
      }
      
    2. 当 Age 有多个成员时,我们还是可以以一个 int 指针来操作对应的结构值.如下. C 语言中结构的成员的内存布局是按顺序的. 我们也就可以按相应的 内存顺序存取相应的数据.

      typedef struct Age{
          int age;
          int month;
      } Age;
      
      int main(int argc, const char * argv[]) {
          Age age = { 3,6 };
          int *age2 = (int *)&age;
      
          printf("age2=%d\n", *age2);//age2=3
          *age2 = 5;
          printf("age.age=%d\n", age.age);//age.age=5
          printf("age.month=%d\n", age.month);//age.month=6
          *(age2 + 1) = 11;
          printf("age.month=%d\n", age.month);//age.month=11
          return 0;
      }
      
    3. 将一个整数赋值给一个 8 位的整型变量,就相当于这个整数的二进制表示的前 8 位塞进对应内存 8 bit 的空间.(不考虑符号)

    4 条回复    2017-02-21 07:28:12 +08:00
    akking
        1
    akking  
       2017-02-21 01:57:27 +08:00
    Everything is just zero and ones.
    Lonely
        2
    Lonely  
       2017-02-21 02:10:37 +08:00 via iPhone
    从汇编代码看就非常清楚了
    czheo
        3
    czheo  
       2017-02-21 03:25:11 +08:00
    看过最精辟的理解应该是:“类型”决定了能做的“操作”。
    Cbdy
        4
    Cbdy  
       2017-02-21 07:28:12 +08:00 via Android
    c 语言类型这么弱,用起来也就浮点和整型差异。要举也举函数指针的例子嘛
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5968 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 02:33 · PVG 10:33 · LAX 18:33 · JFK 21:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.