目录
数据的基本内置类型
数据的分类
数据的储存
对于浮点型数据呢?
那么我们又该怎样取出浮点数呢?
数据的基本内置类型
- char //字符数据类型 1byte
- short //短整型 2byte
- int //整型 4byte
- long //长整型 4byte
- long long //更长的整型 8byte
- float //单精度浮点型 4byte
- double //双精度浮点型 8byte
1.整型
char
unsigned char //无符号字符型
signed char //有符号字符型
short
unsigned short //无符号短整型
signed short //有符号短整型
int
unsigned int //无符号整型
signed int //有符号整型
long
unsigned long //无符号短整型
signed long //有符号短整型
long long
unsigned long long //无符号短整型
signed long long //有符号短整型
2.浮点型
float
double
3.构造类型
数组
结构体
联合体
4.指针类型
int* pa;
char* pb;
float* pc;
voide* pd;
5.空类型
常用于函数的返回类型和参数,指针类型
数据的储存 计算机中整数的表示方法有三种;原码、反码、补码。
其中对于正整数而言,他的原码,反码和补码是相同的。
让我们用实例进行探究。
int a=20;
其中20是属于 int 类型,已知 int 型在内存空间中消耗4个字节,也就是32个比特位,因此20在内存中的二进制序列为下;
如果 int a=-20;
现在我们已经知道了原码,反码和补码的二进制数列,那么数据在内存中是以什么形式存在的呢?
我们以一个简单的数据处理进行判断;
计算(-1)-2的值
因为计算机处理数据时没有减法
所以计算机处理的数据应该是 (-1)+(-2)
假设他们是以原码的形式储存
-1的原码
1000 0000 0000 0000 0000 0000 0000 0001
-2的原码
1000 0000 0000 0000 0000 0000 0000 0010
相加得到
0000 0000 0000 0000 0000 0000 0000 0011
符号位的1与1相加,离开了内存空间,结果为3
所以不是以原码储存的
同理
-1的反码
1111 1111 1111 1111 1111 1111 1111 1110
-2的反码
1111 1111 1111 1111 1111 1111 1111 1101
(-1)+(-2)
1111 1111 1111 1111 1111 1111 1111 1011
-3的反码应该是
1111 1111 1111 1111 1111 1111 1111 1100
所以数据在内存中的储存方式也不是反码
那补码呢?
-1的补码
1111 1111 1111 1111 1111 1111 1111 1111
-2的补码
1111 1111 1111 1111 1111 1111 1111 1110
相加
1111 1111 1111 1111 1111 1111 1111 1101
对补码进行取反加一得到原码
1000 0000 0000 0000 0000 0000 0000 0011
结果为3,由此可知,整型数据在内存中储存的方式为补码;
对于浮点型数据呢?首先来看一段代码
你认为这串代码的结果是什么呢???
答案揭晓
和你预想中的结果一样吗?根据这串小小的代码,相比我们就可以发现,浮点型数据的储存类型是完全不同与整型数据的。
十进制;5.5
可以转化为
二进制;101.1
浮点数的储存分为三个部分
(-1)^s * M * 2^E
二进制为101.1
(-1)^0 * 1.011 * 2^2
s=0 M=1.011 E=2
由于M一定是一个大于等于1,小于2的存在,所以M的第一位不在内存中储存,这样可以节省一位有效数字。
由于E是一个无符号整型,这意味着,如果E为8位,它的取值范围为0~255,如果E为11位,它的取值范围为0~2047。 但是,我们 比如,
对于32位浮点数来说,S E M 的分布如下
对于64位(double)型浮点数而言
那么我们又该怎样取出浮点数呢? 在取出浮点数时,我们不经要在M的最前面加上一个1,用S来判断浮点数的正负。
对于E,我们需要考虑三种情况。
比如: 0.5(1/2)的二进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位,则为 1.0*2^(-1),其阶码为-1+127=126,表示为 01111110,而尾数1.0去掉整数部分为0,补齐0到23位00000000000000000000000,则其二进 制表示形式为: 0 01111110 00000000000000000000000 2.E全为0 这时,浮点数的指数E等于1-127(或者1-1023)即为真实值, 有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。
这样做是为了表示
±0,以及接近于 0的很小的数字。
整型9在内存中储存的补码为;0000 0000 0000 0000 0000 0000 0000 1001
将9的补码以浮点型来展开;则 S=0 E全为0 M=0.000000000000000001001
此时,E全为0;M不再加1,浮点数所表达的是一个接近于零的数,所以程序答应的结果为零。
浮点数9在内存中的储存方式;
0 |10000010 |001 0000 0000 0000 0000 0000
以整型的方式来展开;将
0 |10000010 |001 0000 0000 0000 0000 0000作为补码计算;
原码为;
0 |10000010 |001 0000 0000 0000 0000 0000
此二进制代码表示的整数就是代码所打印的数。
如果你能看到这里,我真的很感谢。
如果能点个赞再走,那就更好了。
我是个刚刚接触C语言的萌新,如果有纰漏之处,还请大佬斧正。
谢谢大家支持!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)