最近突然对类型转换多了一些理解. 这些理解如果用一句话来总结就是: 类型即协议. 一个类型就是一个如何存取数据的协议. 而类型的转换,则是说明数据读取的协议转换成另一个适用的协议. 对 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 的空间.(不考虑符号)
1
akking 2017-02-21 01:57:27 +08:00
Everything is just zero and ones.
|
2
Lonely 2017-02-21 02:10:37 +08:00 via iPhone
从汇编代码看就非常清楚了
|
3
czheo 2017-02-21 03:25:11 +08:00
看过最精辟的理解应该是:“类型”决定了能做的“操作”。
|
4
Cbdy 2017-02-21 07:28:12 +08:00 via Android
c 语言类型这么弱,用起来也就浮点和整型差异。要举也举函数指针的例子嘛
|