前言
在计算机看来存储器中信息都是二进制的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。(数据类型的解释方式)
可以看出,强制类型转换有时候会让结果变的让人难以预料,因此这种技巧一般不太推荐使用,但是这种手段也确实是程序设计语言所必需的。
本文深入探讨了计算机存储数据类型的原理,包括位排列规则、起始位置、数据类型的字节数和解释方式,并通过实例展示了如何在C语言中进行强制类型转换,以及这一操作对数据存储的影响。

被折叠的 条评论
为什么被折叠?



