C语言:基本数据存储

在C语言中,有三种基本数据类型,分别为整形,字符型和浮点型。那么这三种数据类型是以怎样的形式在内存中存储呢?

首先在说明数据在内存内容时,我们要了解数据在内存如以怎样的顺序来进行存储。那么字节序的概念就不可避免,字节序是CPU对内存中的数据以字节为单位进行存取的顺序

而内存中的地址有高低之分,数据的二进制也有高低之分,所以有了两种数据存储的分类。即:大端存储和小端存储。

其中,大端存储是指低地址存高位小端存储是指低地址存低位。例:假如存在数据int a = 0×01020304,则数据a在大小端中的存储为:(二进制是从高位到低位)(地址是从低到高)

大端小端
01 02 03 0404 03 02 01

不同的CPU架构,可能会有不同的存储方式。我们可以用代码来检验本机是大端存储或是小端存储。代码如下:

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int a = 1;
	char b = (char)a;
	if (b == 1)
	{
		printf("是小端存储\n");
	}
	else
	{
		printf("是大端存储\n");
	}
	system("pause");
	return 0;
}

在了解字节序之后,我们需要明白数据的二进制存储类型。首先是对于机器数和真值的概念,机器数:一个数在计算机中的存储形式是二进制数,这些二进制数就是机器数。机器数是有符号的,在计算机中用机器数的最高位存放符号位0表示正数1表示负数

机器数的真值:因为带有符号位,所以机器数的形式值并不等于它的真值,以机器数1000 0011为例,其真正的值为-3,而形式值为131。将带符号的机器数的真正表示的值称为机器数的真值。

而后是原码、反码和补码。原码的表示于机器数的真值表示一致,即第一位表示符号,其余位表示数值。反码的表示以数字的正负分为两种,正数的反码是其原码本身负数的反码是在其原码的基础上,符号位保持不变,其余位取反。补码的表示也以数字的正负分为两种,正数的补码是其补码原码本身;负数的补码是在其反码的基础上加1。

我们可以通过编译器来查看正负整形数在计算机内存中的存储情况:

 很明显,归于正数整形的存储是存储它原码的十六进制;

而对于负数整形的存储时存储它补码的十六进制。

这样的存储是因为,正数整形的原码和补码一致,而且以补码形式存储会便于计算机运算,会节省运算单元。例如1+(-1),通过补码进行运算便是,0000 0001(补码) + 1111 1111(补码) =0000 0000(补码)=0000 0000(原码)=0。

而后是浮点数在内存中的存储,首先是小数转化为二进制,叫做乘2取整法,例如0.25_>01;其中小数在内存的存储是以浮点形式进行存储的,例如5.25_>1.0101*2^2;0.25_>0.01_>1.0*2^-2。

然后关于浮点数的存储有一种算术标准,叫做IEEE 754标准,即IEEE二进制浮点数算术标准。它将浮点数的表示分为三个部分:1.S-符号位(Sign),决定数字的正负,0-正数,1-负数(对于0的符号位解释当作特殊情况处理);2.E-指数位(Exponent),是2的幂,是对浮点数进行加权;3.M-有效数字位(Significand),也叫尾数位(Mantissa)、系数位(Coefficient),是二进制小数。

S(符号位)E(指数位)M(有效数字位)

因为指数位的数值可能出现负值,但是指数域是无符号的,无法表示负数,所以采用指数基数127,也就是说,指数位存储的数据是实际指数值+127

我们以-9.625为例,1.先以二进制浮点数将-9.625表达出来,即-9.625的二进制为1001.101.用规范的浮点数表达出来即为1.001101*2^3。

2.其次因为-9.625为负数,所以符号位S取1;指数值为3,所以指数位3+127=130,二进制表示为1000 0010。有效数字位是省略小数点左侧的1之后为001101,右侧用0补齐。

因此得到最终结果为:

符号位S指数位E有效数字位M
11000 00100011 0100 0000 0000 0000 000

3.最后,将其转换为十六进制的数据,即1100 0001 0001 1010 0000 0000 0000 0000转换为十六进制为0×C11A0000。

 通过编译器也可以看出结果的正确性。

对于不同位的操作系统,这三个区域所占的比特位也不相同:

32位操作系统64位操作系统
符号位S11
指数位E811
有效数字位M2352

然后除了上述格式化值的,IEEE754还规定以下特殊数值,即:±0和±∞。

指数位E有效数字位M
全为0全为0±0
全为1全为0±∞

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值