上一节,我们重点介绍了bool型和整型数据,并介绍了计算机的三种码制——原码、反码和补码。既然有整型,那当然有非整型,还有字符型和字符串。
sizeof
前面我们说过,有很多奇怪的、由基本数据类型衍生出来的数据类型,比如long long或者long int等等,我们一时之间会不知道这些奇怪的数据类型占多大字节,该怎么办呢?
这里教给大家一个方法——关键字sizeof,记住sizeof是一个关键字,不是函数,是关键字!很多初学者甚至是很多资深的程序员都会误解sizeof是个函数,其实它是个关键字。
怎么用呢?
看下面这个例子:
先来看sizeof的用法,sizeof()括号里填上定义的变量或者是数据类型都可以,我们看这个printf函数,是不是和之前有所不同,多了两个%d,还有一个逗号后面的表达式。
首先看看一直出现的“\n”,这是啥?
“\n”叫换行符,顾名思义,一句话打印完换一行。
还有这个%d是什么呢?
严格意义上来说,叫格式控制串,这个我们到具体将printf函数再说,%d表示输出有符号的十进制数,%u是输出无符号的十进制数,%f是输出浮点数,%c是输出字符型,%s是输出字符串。
上面列举了常用的几种格式控制串,大家记住就好,对应一个%+[格式字符],逗号(英文格式)后面就要加一个变量,如果有多个变量,也用逗号隔开。
我们来看结果:
同样地,如果遇到乱七八糟的数据类型不知道占几字节,也可以用这种方式,比如long long和long int:
当然,你可以定义一个变量,把变量放在sizeof()里也能得到同样的结果。再强调一遍,sizeof是关键字,也就是第三章要说的32个关键字(现在不止32个),不是函数。
浮点型
OK,接下来进入上节遗留的问题,浮点型,浮点型又称实型,很简单,基本浮点型就两个double和float,当然,还可以衍生long double型等,先看基本内容。
float
单精度型,一般占4字节,浮点型编译器默认保留6位精度(就是编译器默认只输出小数点后六位,除非用户自己设置保留几位),float就是6位精度,有效位数是7位。定义float a;
double
双精度型,占8字节,15位精度,有效位数是16位。上面举例的long double是占16字节的,一般情况下我们是用不到了,为啥呢?
小数点后15位数都不够你用的,你想上天么?定义double a;
我们前面介绍整型数据类型都直接告诉大家取值范围,到浮点型咋不给呢?直接给怕你们印象不深,我们通过程序写出来。
前面告诉大家%f是可以输出浮点数的,但是在这里我们要全部显示出来,因为光听我讲精度是几位,取值范围是多少,大家怀疑,拿我们打印出来好了,所以换一个,%E或%e,按指数形式输出单、双精度实数,大家自己看。
怎么写?
用这个头文件,老规矩,先引用:
我们可以看到,FLT_MAX、FLT_MIN、DBL_MAX和DBL_MIN这四个大写的宏,这个宏出自这个头文件里。
啥叫宏?
卖关子。反正这几个宏就是float和double能赋的最大值和最小值,来看结果:
知道我为啥不直接写了吧……
老规矩,总结上图(包括long double):
字符类型
我们char字符型终于上场了。无论哪种操作系统,字符类型都是占一个字节。比如char a = ‘a’;前面的a是变量,后面的a是字符,要用单引号。
为啥是单引号?
如果是双引号就变成了接下来要说的字符串了,记住’a’和”a”不是同一个东西。还有,前面提到的\n也是一个字符。
说到字符类型,就不得不提一个东西——ASCII表,长啥样子呢?
我们看一共0~255,256个,为啥是256个字符?
因为char占一字节,无符号最大就是255。
我们来说下这个ACSII表怎么用,看97号,字符a,程序如下:
定义一个字符变量s,赋值为’a’,我们分别以%d和%c打印,还记得啥意思不,以十进制和字符型输出,我们看结果:
可见,a字符在ASCII表中的确是97,没毛病吧。
既然我们说了,char是整型和字符型,那能不能直接用整型输出字符型呢?
当然没问题,我们看程序:
一样是可以的。
字符串
C语言中使用双引号" "表示一个字符串,比如:"ABCDEF"。这就是我们在打印"Hello World!"时为什么要使用双引号的原因。
如果大家学过C++,应该知道有个string是专门定义字符串的,但C语言没有这个关键字,但也有办法,就是用数组,这个我之后再说。
其他类型
基本数据类型基本就给大家讲完了,至于构造类型、指针类型和void,我们之后在结构体和指针再说,咱们慢慢来。
总结
这一节给大家简单介绍了sizeof这个关键字(再强调一遍,不是函数),浮点型以及printf的另一种形式,还有字符型和字符串型(讲数组时详细分析)。基本数据类型已经说完了(要注意我一直强调的部分),那结束了吗?并没有,我们只是初识了数据类型。变量和常量的存在,并没有深入细聊可能存在的坑,所以,下一节继续。
上节作业分析
定义一个signed char型变量a,a = 128; 输出a的值是多少?请具体分析,并打印验证,欢迎小伙伴在评论区晒出你的作业!
我们按步骤啦来,首先128是正数,其原反补码均相同:
原码:1000 0000
反码:1000 0000
补码:1000 0000
然后计算机看到第一位是1,是负数,从补码回推原码
补码:1000 0000
反码:1111 1111
原码:1000 0000
所以打印出来的是-128。
本节作业
以下代码的输出结果是什么?
尽量自己做,然后敲代码验证。
温馨提示:第一节有一个很奇怪的链接,大家记得保存哦~