计算机对存储信息的解释

来源:互联网 发布:voa软件下载 编辑:程序博客网 时间:2024/05/17 21:47

前言

在计算机看来存储器中信息都是二进制的bit流,计算机在解释一个数据类型的值时主要有四个因素:位排列规则(大端或者小端)、起始位置、数据类型的字节数、数据类型的解释方式

位排列规则

如果将一个32位的整数0x12345678存放到一个整型变量(int)中,这个整型变量采用大端或者小端模式在内存中的存储由下表所示。

地址偏移

大端模式

小端模式

0x00

12(OP0)

78(OP3)

0x01

34(OP1)

56(OP2)

0x02

56(OP2)

34(OP1)

0x03

78(OP3)

12(OP0)

小端:较高的有效字节存放在较高的的存储器地址,较低的有效字节存放在较低的存储器地址。
大端:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址。

起始位置

数据存储的起始地址,计算机 要按照那个字节开始解释。

对于特定的系统来说,前两种因素都是特定的,而对于后两种因素的改变,则可以改变一个数据类型的值的最终计算结果,这就是强制类型转换。

对于大部分高级程序设计语言来讲,都提供了强制类型转换。

比如C语言,我们可以将一个无符号int类型的值强制转换为其它类型,在转换之后,对于上面四个因素之中,改变的是最后两个。为此我们写一个小程序来看下这个有意思的事情。

#include <stdio.h>int main(){    unsigned int x = 0xFFFFFF61;    int *p = &x;    char *cp = (char *)p;    printf("%c\n",*cp);}

这是一个简单的强制类型转换示例,可以看到我们将一个无符号int类型的值,先赋给了一个int类型的指针,又强制转换成了char类型的指针,最终我们输出这个char类型指针所代表的字符,结果的输出是一个a。

输出a的原因就是由上面的四个因素决定的,我们看这个具体程序上的四个因素。

1、cp指针的值与x变量的起始内存地址相等。(起始位置)

2、LZ的linux系统是小端表示法,也就是说假设x变量的起始内存地址为0x1,那么0x1-0x4的值分别为0x61、0xFF、0xFF、0xFF。(位排列规则)

3、char只占一个字节,因此会只读取0x61这个值。(数据类型的字节数,或者说大小)

4、0x61为十进制的97,对应ascii表的话,代表的是字符a,因此最终输出了a。(数据类型的解释方式)

可以看出,强制类型转换有时候会让结果变的让人难以预料,因此这种技巧一般不太推荐使用,但是这种手段也确实是程序设计语言所必需的。

0 0