上一节我们用如何用程序写一个计算器的例子,延伸到为啥会有数据类型、变量和常量的存在,并介绍了赋值和等于的区别。从这节开始详细分析这三个概念,从基本数据类型的整型开始,不多比比,直接上主菜。
BOOL型
上一节那张图大家还有印象不,算了,我再放一张吧。
在讲基本类型前,先说说一个特殊的存在——逻辑类型。我们用bool表示,当bool值为1,表示正确;bool值为0,表示错误。
记住,bool类型只有1和0两个值。如果你要在程序中使用bool类型的数据,记得引用#include <stdbool.h>这个头文件。第一节我们说了,用人家东西就要跟别人打声招呼。使用方式为bool a;
一般来说,我们使用bool类型时,不具体赋值0和1,而是用false和true代替,值是一样的,主要是仪式感。
还有一点需要强调,那就是,值为何才表示正确呢?
记住,在C语言中非0即为真(真:正确),例如5、20都是真,-10也是真,只有0表示假(假:错误)。
给大家演示一下:
这里使用if语句进行验证,还记得我们之前说的main函数{}作用吗,表示括号的程序属于main()里的,这里{}里的内容属于if()语句的。这段程序写的是,如果10是真,就打印“aaa”;如果-250是真,就打印“bbb”;如果0是真,就打印“ccc”,我们看执行结果:
从结果看,10和-250都是真,0为假,即验证了C语言中非0即为真。
整型
整型分为char、short、int、long,最大的特点就是在不同平台或编译器下所分配的内存空间不同,这里我们统一按32位系统处理。
1. char
char其实是一个字符型,但也可以定义整型,在32位操作系统中储存大小为1字节。
这里出现了一个新的概念——字节(Byte,简写为B)。字节是计算机信息存储容量的计量单位,和大家用米做计量长度的单位一样,只不过这里是计算机用的单位。
大家都知道,电脑只认识二进制数字串,就是“0”和“1”,一个“0”或者“1”,就是一位,位用bit(比特)表示,那101010就是6个数字,就是6位,32位系统就表示一次性可以处理32位数据。
而一个字节是8位,也就是有8个二进制数。而字符型char大小为一个字节。
每一种基本数据类型都有两种形式:有符号数(signed)和无符号数(unsigned)
如果是无符号数,最小是0000 0000,为0,最大为1111 1111,即2^8-1,为256。
如果是有符号数,最高位为符号位,0表示正,1表示负。
0 000 0000~0 111 1111,范围为0~127;1 000 0000~1111 1111,范围则为-1~128;所以unsigned char范围是0~255,signed char的范围是-128~127。
注:
①.如果不写signed或者unsigned,则代表默认有符号signed
②.所有数据在计算机中均以补码的形式存放
啥叫补码?
你看,C语言就是这样有趣,一环套一环。在计算机中有三种码制:原码、反码和补码,简称原反补。
正数:原反补一致,均是原码本身。
(char)举例:
为啥用char型的数举例呢,因为字节少,没别的原因。
正数:10
原码:0 000 1010(二进制、八进制、十进制、十六进制之间的转换会算吧,高中应该都学过的)
反码:0 000 1010
补码:0 000 1010
再看负数:-10
原码:1 000 1010
反码:1 111 0101反码是在原码除符号位不变,其余位取反
补码:1 111 0110 补码 = 反码 + 1
这也是计算机中对于数值-10最终的存放形式。
因为char型数据的数值较小,所以会导致数据的越界问题,而越界不会报错。
假如给signed char型数据赋值129(signed char的范围是-128~127),那我们最终看到的数是多少呢?
先看结果:
答案是-127,我透,你电脑坏掉了吧,额……虽然我的电脑用了五年,确实卡的要死,但真的没有坏掉,那为啥是-127呢?
我们来推理下:
首先129是个正数,所以原反补一样,即
原码:1000 0001
反码:1000 0001
补码:1000 0001
唉,这个时候计算机看到最高位是1,又是个有符号的数,就会认为这是一个负数,会按照负数的方式处理。计算器存的是补码,给我们显示的是原码,所以我们要倒推出原码来:
补码:1000 0001
反码:1000 0001 补码 = 反码 + 1.那么反码 = 补码 - 1
原码:1111 1110 符号位保持不动,其余各位取反
结果为-127,是不是很神奇。
char整型就介绍到这里,char字符型之后再说。
2.short
短整型,占两个字节,也就是16位,定义方法为short a;前面有unsigned就是无符号整型,数据值的范围为-32768~32767,没有就默认有符号,数据值的范围为0~65535。
3. int
整型(拆解hello world留下的坑终于填了,我太好了),占4个字节,也就是32位,定义方法为int a;前面有unsigned就是无符号整型,数据值的范围为……按计算器太麻烦了,反正不超过10位数就行。
说起int,我想起一个血泪史,看过前文的应该都知道,我其实不是直接接触C语言的,而是从单片机学起的。
51单片机,是个8位的,那里面的int是占2个字节,然后我就一直以为int 占两个字节,直到我学C语言的时候,书上写int是4个字节时,我笑了,举手就向C语言老师纠错,“老师,int是两个字节,书上错了。”我永远也忘不了老师那种看沙雕的眼神。
上课玩手机它不香吗?睡觉它不香吗?上课和心仪的对象聊天它不香吗?啪!上大学还挑课本的毛病,简直有毒。从此我就明白了一个道理:少说话,多做事!
虽然我被狠狠打脸,但是我们可以看到,在不同的系统下,数据类型所占字节数是不一样的,在8位单片机下,int确实是2个字节,和32位下的short一样,这也是一开始我强调是在32位系统下的分析。
记住,如果以后做题碰到问字节的问题,没有给明是什么操作系统,一律默认32位。
3. long
长整型,也是占4个字节(32位操作系统中,x86),但在64位操作系统下long就占8字节了(x64)。
以上是整型数据类型的基本类型了,但有时候大家会看到long long或者是long int这种写法,其实也没什么稀奇的,32位中,long long占8字节,long int占4字节,大家不必纠结,因为这些都不常见,也没什么卵用。
但你们知道,我是个好人,上面这么多内容,我怎么忍心看着大家死记硬背呢。
这里给大家列了一张表,不用多说了吧,点赞、关注和转发,懂我意思吧。
总结
本节给小伙伴们详细介绍了char、short、int和long这四种基本整型数据类型,在介绍之前,还给大家讲了一种特殊的数据类型,叫bool,使用方法也详细介绍了。
同时还穿插了原反补三码,以及数据越界(注意,数据越界编译器不报错!不报错!不报错!)的分析,以及各种整型数据类型所占字节数、取值范围。
那既然有整型,有没有非整型,比如小数呢,当然有啦,下一节继续!
上节作业讲解
下面哪种赋值方式符合C语言标准(假设所有变量均已定义)?
A = b; 4.5 = xs; c = 5 + 8; sd = c+7; d = 79.3 + d; a+b = 89; a == 23; i++; ++i;
根据上节所学的知识,赋值号的左边必须是一个变量,复制号右边不限制,符合上述条件的是A = b; c = 5 + 8; sd = c+7; d = 79.3 + d; a == 23; i++; ++i;
最后两个为什么也符合呢?
这两种都表示i = i + 1;,也叫自增1,那++i和i++有啥区别呢?
嘿嘿……
本节作业
定义一个signed char型变量a,a = 128; 输出a的值是多少?请具体分析,并打印验证,欢迎小伙伴在评论区晒出你的作业!.
温馨提示:第一节有一个很奇怪的链接,大家记得保存哦~