概述
文章目录
- 1.整形家族
- 1.1整形家族成员
- 1.2整形家族成员长度比较
- 1.3变量范围限制
- 1.4为什么有多张ASCII码表
- 1.5整形常量(字面值)
- 2.浮点数家族
- 2.1浮点数家族成员
- 2.2浮点数成员取值范围
- 2.3浮点数存储
1.整形家族
1.1整形家族成员
字符,短整形,长整形,整形都分为有符号和无符号,总共9种,如下变量最小范围表所示9种类型;
1.2整形家族成员长度比较
需要注意的是:没有规则规定长整形一定要比整形长,而是长整形至少和整形一样长;
比如在VS2013之中long可以表示的大小和int可以表示的大小一致:
如下图所示:整形int和长整形long的长度是一样的,占4个字节,32个比特位;
我们知道程序不仅仅是在自己的机器(环境)上跑,因此需要程序具有一定的可移植性,因此ANSI标准中对各种整形的最小允许范围做了一个规定,如下表所示
变量的最小范围
类型 | 最小范围 |
---|---|
char | 0-127 |
signed char | -127-127 |
unsigned char | 0-255 |
short | -32767-32767 |
unsigned short | 0-65535 |
int | -32767-32767 |
unsigned int | 0-65535 |
long | -2147483647-2147483647 |
unsigned long | 0-4294967295 |
这个标准规定了短整形short最少是占2个字节,长整形long最少占4个字节,而缺省(系统默认)的整形int则最少占 2个字节;
缺省值,通常为机器最自然(高校)的位数;
由此规定可以证明,长整形不一定长于短整形,但是至少不会比短整形短;
1.3变量范围限制
得知了最小的范围之后,在c中变量的范围限制是怎样确定的呢?
头文件limits.h中定义了如下表格之中的一系列名字,来规定变量的范围
变量的范围限制
signed | signed | unsigned | |
---|---|---|---|
类型 | 最小值 | 最大值 | 最大值 |
字符 | SCHAR_MIN | SCHAR_MAX | UCHAR_MAX |
短整形 | SHRT_MIN | SHRT_MAX | USHRT_MAX |
整形 | INT_MIN | INT_MAX | UINT_MAX |
长整形 | LONG_MIN | LONG_MAX | ULONG_MAX |
如上图所示,signed char的最小值是-128,最大值是127。unsigned char的最大值是255,无符号的最小值肯定是0咯;
1.4为什么有多张ASCII码表
char存在的价值是用来容纳字符型值;
由1.3我们知道,不同类型的char的取值范围有两种分别为unsigned和signed,那么不同的编译器默认的char的取值范围会不同,在进行程序移植的时候可能会出现问题;
那么把这类变量声明成unsigned和signed不就行了吗?
这样做也会有一些小问题,有的机器擅长处理signed,有的机器擅长处理unsigned,还有许多处理字符的库函数把他们的参数声明为char,所以我们直接将参数显式声明成unsigned或signed,可能会出现兼容问题;
最佳的方法是将储存char型变量的值限制在unsigned与signed的交集之中,所以我们的常用ASCII码表的范围是 0-128即unsigned与signed的交集(-128-127与0-255的交集为0-127);
后来由于需求扩张又补充了对应的ASCII码表,但是并不是在任何环境下都能使用;
1.5整形常量(字面值)
常量是不可以被修改的,但是可以被命命名。整形常量属于那种类型,取决于它的书写方式,比如:
在整数后面添加L或者l,表示这个整数被解释为long整形值,添加U或者u被解释为unsigned整形值,如果各添加一个就被解释成unsigned long整形值;
表示十进制整形常量:123;
表示8进制整形常量:在数字前面加0,比如0123;
表示16进制整形常量:在数字前面加0x,比如0x11223344;
除此之外还有字符常量,他们的类型总是int,不可以在它们后面添加后缀;
在不同的场景可以使用不同类型的整形常量比如表示地址:0xF000就可以很清晰的表示出12-16比特位为1其余的全为零,用10进制就看不出来了;
2.浮点数家族
2.1浮点数家族成员
浮点数家族包括float,double和long double
2.2浮点数成员取值范围
同样规定double的长度至少不能小于float,还规定了一个最小范围:所有浮点类型至少能够容纳10(-37)到1037之间的任何值;
头文件float.h 定义了如下表所示名字表示浮点数所能存储的最大最小值
浮点数范围限制
类型 | 最小值 | 最大值 |
---|---|---|
float | FLT_MIN | FLT_MAX |
double | DBL_MIN | DBL_MAX |
long double | LDBL_MIN | LDBL_MAX |
如上图所示为float所能存储的最大值和最小值;
2.3浮点数存储
float.h还定义了浮点数怎么进行存储,下面以float为例进行介绍
正数在内存的存储是以最高位为符号位,其余为数值的二进制序列,那么浮点数在内存中是怎么进行存储的呢,接下来我们一起看一看;
假设一个数为1154,那么用科学记数法可以表示为1.154*10^3,同理在计算机中也可以用科学计数法进行存储,那么他是怎么进行的呢?
比如:10在计算机中是以二进制储存的,即1010,转化为科学技术法为 (-1)^s* 1.01*2^3;
规定有,s为符号位,0代表正数,1代表正数,M=1.01代表有效数字,E=3, 2^E代表指数位;
对于32位浮点数,最高的一位比特位是符号s位,接下来的8位是指数E,剩下的23位为有效数字M,如图所示:
M的存储:在上述中,可以清晰的认知到1<=M<2,即M的首位永远都是1,那么进行存储时就被不在对1进行存储,只存1后面的数字,如此一来M可以保存24位有效数字;
M的存储是在图中M位处的最左端开始,多余的比特位补0处理;
E的存储:很显然E是一个无符号整数,8个bit取值范围为0-255,又可知科学计数法中指数是可以出现负数的,那么就有了规定,当存储E的时候需要加上127,即存储的是 E=10+127;
E的读取:第2点讲到,E存储的时候是加上127的,当然读取的时候也要减去127,可是有如下2种特殊情况:
当E为全0时:很显然读取E的时候减去127为-127,那么很容易理解这样一来2^E会非常小近乎于0,计算机就将此时的浮点数表示为0,并且这个0值不是唯一的;
如图,当E取值靠近0时,E-127的值都非常小,整个浮点数的值也会趋近于0,在这个区间内有无数个E值使得浮点数的值表示为0,因此在进行浮点数的判断的时候不能直接如下所示
if(floa==0),而应该表示为一个区间,例如if(floa<-10^-9 && floa>-10^-9),因为浮点数的0值是一个区间;
当E为全1时:这是2^E就会非常的大,即达到了浮点点数极值,S位决定了浮点数的取值区间;
附:64位双精度浮点数中,E的比特位为11位,M为52位,E进行存取时加减1023,其余同理;
深度理解,图文解析
注意:float用printf输出的时候,是需要先转换成double再进行输出,这就不难理解,很多float类型的数据用整形输出都是0,因为float转换成64位后,很多时候前面32位都是0,而整形输出只能截取32位的值;
最后
以上就是聪慧秀发为你收集整理的C语言之——整形、浮点家族1.整形家族2.浮点数家族的全部内容,希望文章能够帮你解决C语言之——整形、浮点家族1.整形家族2.浮点数家族所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复