「这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战」
数据类型
1.内置类型
char 字符数据类型
short 短整型
int 整型
long 长整型
long long 更长的整型
float 单精度浮点型
double 双精度浮点型
整型家族
char
有符号还是无符号取决于编译器,大部分编译器下是signed char
unsigned char
signed char
short
unsigned short【int】
signed short【int】
int
unsigned int
signed int
long
unsigned long【int】
signed long【int】
浮点型家族
float
double
2.构造类型
数组类型
int a = 10 去掉名字就是类型所以a的类型就是int
int arr 【10】 = {0}去掉名字arr 所以这个数组类型是int 【10】数组类型是自定义的所以它也是构造类型
结构体类型
枚举类型
联合类型
3.指针类型
int* 整型指针
float* 浮点型指针
char* 字符型指针
void* 空类型指针
4.空类型
void
表示空类型 通常用在函数的返回值类型,函数的参数,指针类型
数据存储
整形存储
char
image-20210813111047103
image-20210813132832428
1 | c复制代码#include<stdio.h> |
打印无符号整形 %u
打印有符号整形 %d
int
整形最大值INT_MAX,最小值INT_MIN定义在limits.h头文件里面
1 | c复制代码#include<stdio.h> |
同样的数据存储,由于看待的视角不同,所以打印出来的结果就不同
image-20210813123848411
short
image-20210813133812748
image-20210813134228967
浮点型存储
float
浮点型大小限制头文件在float.h头文件里面
image-20210813201244908
1 | c复制代码#include<stdio.h> |
根据国际标准IEEE(电子和电子工程协会)754,任意一个二进制浮点数V可以表示成下面形式:
1 | c复制代码(-1)^S*M*2^E |
上面那个是什么鬼玩意是不是觉得懵逼了,下面我们举个例子
image-20210813224424760
1 | c复制代码所以9.0的二进制表现形式可以表示为 |
IEEE754规定:
对于32位的浮点数,最高位是符号位s,接着的8位是指数E,剩下的23位为有效数字M
image-20210813220921441
对于64位的浮点数,最高的一位是符号位,接着的11位是指数位,剩下来的52位是有效数字M
image-20210813220946333
IEEE 754对有效数字M和指数E,有一些特别规定
因为1<=M<2,也就是说,M可以写成1.xxxxx的形式,其中xxxxxx是小数部分
IEEE 754规定,在计算机内部保存M时默认这个数的第一位总是1,所以可以被省略,只保留后面的xxxxxx就好。比如1.01就保存01,等读到他的时候把1加上去就好,这样可以节省一位有效数字
至于E的话
E作为一个无符号整数(unsigned int)8位范围0~255,11位范围0-2047,但实际上科学计数法中的E是可以位负数的,所以IEEE 754规定,存入内存时的E必须再加上一个中间数,8位就加127,11位就加1023,(什么意思呢 就是我们求的真实的E加上一个中间数再存到内存中)
image-20210813221029000
这些仅仅是存进去的那我们是如何取出来的呢?
E在内存中有三种方式可以取出
E不全为0不全为1
这时浮点数就采用下面的规则,E的计算值减去127(或1023),得到真实值,再将有效数字M前面加上第一位1
E全为0
这时浮点数的指数E直接等于1-127(或1-1023)为真实值
有效数字M不再加上第一位的1,而是还原为0.xxxxxxxxx的小数,这样做是为了表示正负0,以及接近于0的很小数字
E全为1
如果有效数字M全为0,表示正负无穷大(正负取决于s)
所以那个题目就好解了
1 | c复制代码#include<stdio.h> |
image-20210813223341105
本文转载自: 掘金