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

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

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

计算机的存储单位:

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

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

深度了解数据类型以及数据在计算机中的存储_第1张图片

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

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

深度了解数据类型以及数据在计算机中的存储_第2张图片

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

#include
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;
}

运行结果为:

深度了解数据类型以及数据在计算机中的存储_第3张图片

整形数据的存储: 

       我们以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。尾数的符号称为数符,阶码的符号称为阶符。所以一个浮点数是由阶符、阶码、数符和尾数四部分组成,浮点数在机器中的常见的表示形式为:

深度了解数据类型以及数据在计算机中的存储_第4张图片

浮点数规格化

 为了提高数据的精度以便于浮点数的比较,在计算机中规定浮点数的小数最左边使用唯一的非零(其实就是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位为数符),则该数据的浮点数(假设阶码和尾数均用补码表示)形式为:

深度了解数据类型以及数据在计算机中的存储_第5张图片

字符型数据的存储: 

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


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

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

你可能感兴趣的:(c++,学习,其他)