标签:
首先抛出问题:
1.int k; char c = (char) k; 请问c中保留的是高位还是地位?
解决这个问题,联合体是最好的理解方式。对于联合体而言,首地址只有一个。就是最低位的地址。而读取数据总是从低位开始读的。每次读取不大于数据总线宽度的位数。
对于一个32位的机器,是可以一次读入四个字节的,包括浮点数,整数等。当数据类型长度大于32时,显然运算效率就会降低。如图,0的位置就是首地址,从0开始读,一个double类型的读两次,一次读32位。之所以将低位写在左边,是为了和我们平时的书写数值习惯相吻合,同时也是与位移操作保持一致。
而对于字符串的书写,我们又是另外一种情形。如“ABCD”。我建议为了与数值的书写保持一致,把它想象的倒过来写,这样,就可以完美的弄清楚类型转换之间的关系了。
数据总是从低位开始读的。
于是我们可以轻易的判断出整数x04241(x042是B,x041是A)里边存储的首字符是‘A’。长数据到短数据是保留的低位数据。短数据到长数据增加的是高位0。所以有如下测试程序和结果
union { char c; __int8 i; __int64 d; }sdd; int main (){ sdd.c=‘c‘; sdd.d =0x44434241; int k = 0x4241; k |= 1<<1; printf("%d\n",&sdd.i); printf("%d\n",&sdd); printf("%d\n",&sdd.d); printf("%c\n",sdd.c); printf("%c",(char)k); }
输出为:
17863024
17863024
17863024
A
C
由此可知,联合体也总是从首地址(地位)开始读。自带类型转换,通过增减高位来完成类型转换。
标签:
原文地址:http://www.cnblogs.com/ele-oy/p/4935470.html