从简单的变量运算看数据存储

    先来看一段代码。

#include<stdio.h>
int main()
{
	char a = -1;
	signed char b = -1;
	unsigned char c = -1;
	printf("%d %d %d", a, b, c);
	return 0;
}

    让我们看一下他的输出结果

 

    可以看到,变量a和变量b的输入和输出是对的上的,为什么c的输出会变成255,这就要从变量在内存中的存贮方式讲起了。

整形数据的存储

  char类型

    我们都知道,计算机的数据最终都是以二进制的方式存储在内存中的,而不同类型的变量其存储空间的大小和存储方式都有不同,char类型在内存中需要使用一个字节,也就是八个bit的大小来存储数据。在C语言中,char类型和signed char在大部分情况下可以看做是相同的类型,这时变量为有符号变量,最高位为符号位,所以-1的二进制序列应该写成10000001。但是内存在存储数据时,不会直接将二进制码存在内存中,而是会将二进制源码转化为补码进行存储,如下图:

     可以看出,当变量赋值为无符号数时,最高位为0,原码反码补码都相同。反之,有符号数的反码为源码出符号位外取反得到,补码为反码加1.。

    所以,当我们为变量赋值-1的时候,我们实际存储在内存中的数据应该是11111111 。明白了输入的原理, 我们再来看输出的结果。先看程序,a和b都是有符号数,最高位是符号位,所以在输出时,系统会按照有符号数的输出规则将其输出为-1。而对于变量c,虽然我们是以有符号数的形式输入的,但我们在定义变量c时,使用的时unsigned char,即无符号数形式,最高位不是符号位。所以在输出时,系统会以无符号数的形式输出c,也就是将二进制的11111111直接转换为十进制的255。所以我们才会看到上面的结果。

    综合以上,我们可以总结一下,char类型变量在计算机系统中大小为8bit。当char为signed时,其范围在-128(10000000)~+127(01111111)之间,而char为unsigned时,其范围是0(00000000)~255(11111111)。

  int类型

    分析完char,相同的原理,我们可以得到int类型在积极选集中的存储形式。int类型的数据在内存中站4个字节,32bit。当int为signed时,其范围在-2147483648~+2147483647之间,而为unsigned时,其范围是0~4294967295。

浮点型数据的存储

    前面我们讲的都是整形数据,那么带小数的数据又该怎么存储呢?这时候就要用到我们的浮点型数据类型了。

    浮点型数据一般有两种类型,float和double。其中float型为单精度浮点数,在内存中占4个字节,32个bit位;double型为双精度浮点数,在内存中占8个字节,64个比特位。

浮点型的存储逻辑

    

    浮点型的数据在存储数据时,会将数据分为三个部分:符号位、指数部分、尾数部。单精度和双精度的不同之处在于指数部分和尾数部分分配的比特位数有区别,对于float类型,他的指数部分有8位,尾数部分有23位;对于double类型,他的指数部分是11位,尾数部分位52位。如下图

   可以比较直观的看出,double型的精度是高于float行的,但是在实际使用时编译器默认打印小数点后6位,所以我们在使用浮点型是,要根据对应的环境选择要使用的类型和需要保留的小数位。

    举个例子:12.625

    我们首先把12转换为2进制数1010

    再讲0.625转换为二进制0.101

    得到12.625的二进制为1010.101=1.010101*2e3

    这样我们就得到了浮点数存入内存的三个:符号位为0,指数部分为3,尾数部分为010101。

    这时我们要注意一个问题,浮点数在存储指数部分时是默认为无符号数的,但实际情况下,若实际数据本身就小于零,指数部分会是负数,所以我们在存储指数部分时,会加上一个偏差值,这个偏差值的大小就是指数部分空间大小的一半,对于 float 类型,偏差为 127;对于 double 类型,偏差为 1023。在实际运算时,需要将指数值减去偏差值来计算实际指数值。相对的,我们的例子中,假设为float型,那么我们得到的指数部分实际是127+3=130,转换为二进制就是10000010。

    由此,我们可以得到float型的12.625在内存中的存贮格式为

 以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值