我是靠谱客的博主 聪慧秀发,最近开发中收集的这篇文章主要介绍C语言之——整形、浮点家族1.整形家族2.浮点数家族,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 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标准中对各种整形的最小允许范围做了一个规定,如下表所示

变量的最小范围

类型最小范围
char0-127
signed char-127-127
unsigned char0-255
short-32767-32767
unsigned short0-65535
int-32767-32767
unsigned int0-65535
long-2147483647-2147483647
unsigned long0-4294967295

这个标准规定了短整形short最少是占2个字节,长整形long最少占4个字节,而缺省(系统默认)的整形int则最少占 2个字节;

缺省值,通常为机器最自然(高校)的位数;

由此规定可以证明,长整形不一定长于短整形,但是至少不会比短整形短;

1.3变量范围限制

得知了最小的范围之后,在c中变量的范围限制是怎样确定的呢?

头文件limits.h中定义了如下表格之中的一系列名字,来规定变量的范围

变量的范围限制

signedsignedunsigned
类型最小值最大值最大值
字符SCHAR_MINSCHAR_MAXUCHAR_MAX
短整形SHRT_MINSHRT_MAXUSHRT_MAX
整形INT_MININT_MAXUINT_MAX
长整形LONG_MINLONG_MAXULONG_MAX

在这里插入图片描述

如上图所示,signed char的最小值是-128,最大值是127。unsigned char的最大值是255,无符号的最小值肯定是0咯;

1.4为什么有多张ASCII码表

char存在的价值是用来容纳字符型值;

由1.3我们知道,不同类型的char的取值范围有两种分别为unsignedsigned,那么不同的编译器默认的char的取值范围会不同,在进行程序移植的时候可能会出现问题;

那么把这类变量声明成unsignedsigned不就行了吗?

这样做也会有一些小问题,有的机器擅长处理signed,有的机器擅长处理unsigned,还有许多处理字符的库函数把他们的参数声明为char,所以我们直接将参数显式声明成unsignedsigned,可能会出现兼容问题;

最佳的方法是将储存char型变量的值限制在unsignedsigned的交集之中,所以我们的常用ASCII码表的范围是 0-128即unsignedsigned的交集(-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浮点数家族成员

浮点数家族包括floatdoublelong double

2.2浮点数成员取值范围

同样规定double的长度至少不能小于float,还规定了一个最小范围:所有浮点类型至少能够容纳10(-37)到1037之间的任何值;

头文件float.h 定义了如下表所示名字表示浮点数所能存储的最大最小值

浮点数范围限制

类型最小值最大值
floatFLT_MINFLT_MAX
doubleDBL_MINDBL_MAX
long doubleLDBL_MINLDBL_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.浮点数家族所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部