(应一些初学者的要求,虽然本人也绝对称不上专业,但是想让一个人快速地走出初学的迷茫,需要这种精炼的集合)
首先,阐明一下我的观点:
不论是什么编程语言,其实有很多的共通之处,基本上你学过一门编程语言,其他的语言也能很快学会.(本人学C++,但是会在必要的时候尽量避开语言特色只讲想法).
在这么广泛且有深度的领域中,有些功能的确没办法先让人理解内部构造再去使用,比如C++语言中的scanf,printf涉及到指针的传递事项和变参,cin,cout涉及到模板和重载运算符等等.但是我还是选择先从存储类型开始讲,上述的复杂的东西以后也会讲到(但是有C++语言特色要开Extra篇).
首先应当让大家知道的是计算机如果采用十进制在资源上(目前)是极为浪费,且性能不优的,而且二进制与十进制的转换是极为方便的,有兴趣可以自行百度"为什么计算机采用二进制",不浪费篇幅.
而正如人要写字,就要有纸和笔,计算机要记录信息,就要给计算机"纸"与"笔","纸"自然是有限的,而"笔"也是有规格的.内存就是计算机的"纸",而对内存读写的部件就是"笔".
(这么说来计算机的"笔"还可以读,哈哈)
但是,人脑所适应的是十进制,二进制对于我们来讲实在不易理解,而且计算机还要记录非阿拉伯数字的信息,比如我这篇文章,于是就有了ASCII编码,并有了对应的存储类型char(character),对于小一点的数有short int,大一点的数有int,再大一点有long long int,这些归到整数(integer)里面,而往往有时候我们要记录小数,于是在integer里面拿几位来记录小数点的(十进制)位置,就有了float(floating number)和double(Double-precision floating-point)
(想一想,为什么不是直接使用二进制记录小数,即记录二进制下的小数点位置?提示:将0.31试着转化成二进制小数,你会发现什么?)
然后把这些类型的属性与可能的bug讲一下,本篇就可以结束了
char:占1字节,记录[-128, 127](提示一下没看懂的小伙伴,这是闭区间,即包含两端点的区间)的整数,ASCII码表中一般期望背一下字符0的ASCII码,字符A的ASCII码,字符a的ASCII码以及空格和换行的ASCII码,下表中先了解[0, 127]码值对应的字符
([128, 255]的部分我想你在学了unsigned以后会明白的,或者我提示一下,你把这个码值转八位二进制看看有什么发现).
short int:占2字节,记录[-32768, 32767]的整数.
int:占4字节,记录[-2147483648, 2147483647]的整数.
long long int:占8字节,记录[-9,223,372,036,854,775,808, 9,223,372,036,854,775,807]的整数.
(想一想,为什么下限的绝对值比上限的绝对值多1?提示:从二进制符号位来思考"正负数"的个数是否相同)
(要讲浮点数,引入一下计算机上的科学记数法,比如6.02e23表示6.02乘以10的23次幂,指数为负数我不用说了吧)
float:占4字节,记录[3.4e-38, 3.4e38]的实数,有效位数为6~7位.(因为有一部分位拿出来记录小数点了,精确度比不上整数的),但是前期入门时用用足够了
double:占8字节,记录[1.7e-308, 1.7e308]的实数,有效数位为15~16位(据说double类型的处理在现代的优化下比float快...)
那么问题就来了:我有一个int类型(32位),如果我将一个占用32位以上的数据赋值给这个int会怎么样呢?答案是32位以上的内容丢弃,32位及以下的内容照搬,而符号位就有可能被赋到1的值,也就是有些时候数据溢出会出现负数,有的时候会有正数.如果上下限不够,我们会采用高精度的方式来扩大上下限,所以大部分情况下出现数据溢出的情况是程序员的不认真导致的bug.
原文链接:https://www.bilibili.com/read/cv6947311