深度了解数据类型以及数据在计算机中的存储

       在我们刚开始编写程序的时候,仅仅是了解并简单实现了对程序的编译和运行,但是,我们平时定义的变量在计算机中是怎么存储的呢?是直接存储?还是转化为某种特定的存储形式进行存储?下面,就让我们一起来了解一下。

现代计算机能处理的数据类型:数字、文本、音频、视频等,统称为多媒体信息

计算机的存储单位:

所有计算机外部的数据都采用统一的数据表示法转换后存入计算机中,当数据从计算机中输出时再还原回来。这种工作模式叫位模式

(bit):即数位,是计算机中最小的数据单位,代表设备的某一种状态,0或1。
字节(Byte):一个字符在计算机内部存储的时候用了8位。人们选定8位为一个字节(Byte,简记为B)。字节是计算机中用来表示存储空间大小最基本的容量单位。
(Word):字由若干字节构成(一般为字节的整数倍),如16位、32位、64位等。它是计算机进行数据处理和运算的单位。字长是计算机性能的重要标志,不同档次的计算机有着不同的字长。
存储空间容量的单位除用字节表示外,还可以用千字节(KB)、兆字节(MB)及十亿字节(GB)等表示。

在C语言中,各个数据类型所占的字节数是根据操作系统的位的变化而变化的

下面是各个数据类型在不同位数的操作系统下的所占字节数

也可以用sizeof运算符来查看数据类型所占的字节数

#include<iostream>
using namespace std;
int main()
{
	printf("int型所占字节为:%d\n",sizeof(int));
	printf("double型所占字节为:%d\n",sizeof(double));
	printf("char型所占字节为:%d\n",sizeof(char));

	system("pause");
	return 0;
}

运行结果为:

整形数据的存储: 

       我们以16位int类型为例,因为在64位的操作系统中,int类型占4个字节,所以它在计算机中总共是2×8=16位二进制数,因为二进制的每一位只能是0或1,所以如果我们想要存储数据为32767的整数时,计算机会自动将32767转化为二进制01111111 11111111来进行存储,这16位的首位(最左边的一位)是符号位,0代表正数,1代表负数,所以在16位操作系统中int型数据只能表示范围为[-2^15 ,2^15-1]之间的整数,可能细心的小伙伴可能会发现,这正负范围不对称啊,这就要提到反码和补码了,我们日常对数据进行计算的时候正常来说是算的原码,而在计算机中是用补码进行存储数据的。

反码解决了源码正负数相加不为0的问题

我们以8位二进制数为例:
1的原码为0000 0001
-1的原码为1000 0001
我们将二者相加后(1+(-1))=1000 0010=-2
由此可见出现了错误,结果不为0; 

正数的原码=反码=补码,负数的反码=原码除了符号位其他取反(0变成1,1变成0),负数的补码=它的反码+1

比如 :-1的反码就是 1111 1110
1111 1110(-1的反码)+0000 0001(1的反码)=1111 1111(反码)=1000 0000(原码)意义为-0,虽然取到了0,但是-0这个负号没有意义,而且还存在着0000 0000这个正0,所以有两个状态都表示着0
-1的补码为1111 1111
0000 0001(1的补码)+1111 1111(-1的补码)= 1 0000 0000 ,这里我们取的是8位,所以最高位舍弃,结果为0000 0000(+0),所以这里0的表示就唯一了。那么之前还有一种表达(-0)1000 000就剩下了,所以就多了1000 0000这样一个数,所以就造成的数据所取类型范围的负数范围比正数范围多了一个数

实型数据的存储:

浮点数表示法:N=S×r^j

其中,S为尾数(可正可负),j为阶码(可正可负),r为基数,在计算机中基数一般取2。尾数的符号称为数符,阶码的符号称为阶符。所以一个浮点数是由阶符、阶码、数符和尾数四部分组成,浮点数在机器中的常见的表示形式为:

浮点数规格化

 为了提高数据的精度以便于浮点数的比较,在计算机中规定浮点数的小数最左边使用唯一的非零(其实就是1)数码,称为规格化数。
以基数r=2为例,若N=101.1011,则N可以写成下列不同的格式:
N=101.1011
=0.1011011×2^11
=1.011011×2^10
=10.11011×2^1
=1011.011×2^-1
=10110.11×2^-10
浮点数规格化N=1.011011×2^10
假设在字长为16的机器中,阶码占7位(其中1位为阶符)、尾数占9位(其中1位为数符),则该数据的浮点数(假设阶码和尾数均用补码表示)形式为:

字符型数据的存储: 

       因为字符型数据不管计算机是16位、32位还是64位操作系统,char类型永远只占一个字节,所以根据ASCII码表(7位ASCII码可以表示128个字符)可以对字符类型的数据进行转换为二进制数存储到计算机中。
       就目前而言,汉字以及其他字符的增多,ASCII码表已经不能涵盖所有的字符,所以目前字符编码的通用形式是Unicode编码,提供了全面的字符集,扩展ASCII中固有的困难,称为4个字节,可以定义2^32个字符和符号。


知识扩展:对于汉字在字符串中的存取,假设我们要存储“小明”,因为汉字占两个字节,所以应该定义char[5],因为C语言会默认加上一个‘\0’。

对于图像和音频,也是同样的原理,是以一种特定的方式转化为二进制数存储到计算机中。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值