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

2017-02-21 00:00:36 +08:00
 banxi1988

最近突然对类型转换多了一些理解. 这些理解如果用一句话来总结就是: 类型即协议. 一个类型就是一个如何存取数据的协议. 而类型的转换,则是说明数据读取的协议转换成另一个适用的协议. 对 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 的空间.(不考虑符号)

2252 次点击
所在节点    程序员
4 条回复
akking
2017-02-21 01:57:27 +08:00
Everything is just zero and ones.
Lonely
2017-02-21 02:10:37 +08:00
从汇编代码看就非常清楚了
czheo
2017-02-21 03:25:11 +08:00
看过最精辟的理解应该是:“类型”决定了能做的“操作”。
Cbdy
2017-02-21 07:28:12 +08:00
c 语言类型这么弱,用起来也就浮点和整型差异。要举也举函数指针的例子嘛

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/341921

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX