理解数据存储

首先抛出问题:

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

由此可知,联合体也总是从首地址(地位)开始读。自带类型转换,通过增减高位来完成类型转换。

 

posted on 2015-11-04 11:39  1的哲学  阅读(291)  评论(0编辑  收藏  举报

导航