最近突然对类型转换多了一些理解. 这些理解如果用一句话来总结就是: 类型即协议. 一个类型就是一个如何存取数据的协议. 而类型的转换,则是说明数据读取的协议转换成另一个适用的协议. 对 C 语言来说,数据类型则是针对内存布局的协议. 下面以 C 语言为例.
如下所例,虽然 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;
}
当 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;
}
将一个整数赋值给一个 8 位的整型变量,就相当于这个整数的二进制表示的前 8 位塞进对应内存 8 bit 的空间.(不考虑符号)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.