前言:
本新鸟已经在c++的路上奔波两年半了。大学就是水,教完面向过程和基本的类之后就不管你了,接着就是批量批量的数据结构、算法吧啦吧啦的。作为一个大二还只会黑框框看结果的骚年,我表示you enough。所以我默默地临幸了html+css+js+php,java,android,MFC,qt,python,最后还是发现qt是真爱啊。但是一个学期的实践总是向我证明c++如此骨感,硌得我XX都疼了。本着小学期看完c++基础教程(英文版,错漏无数),我勉强撑完了软工的折磨。为了防止世界被破坏,为了维护世界的和平,我,c++新鸟,趁着sysu不放假大学赐予了我神奇的30+假期,加速我的c++老鸟之路。
而写着玩意的作用,在于给陈小新小盆友一点动力,某些时候还可以用来回味下,毕竟你每次都会先do2再来写,陈小新小盆友,you enough。好吧,再玩SF剁手。
既然有的是时间,我就默默从《C++ primer plus》第六版中文版开始,毕竟某老师根本就不讲这些细节,只好重新来过了。
c++ primer plus version 6, let's go.
(我懂的我自然不多扯,我只cout那些我认为需要注意的或者根本没注意到的或者注意不到的~~~。)
比特数问题
c++的类型占多少比特一直是我觉得蛋碎的地方,不过我一直记得short是16位,int、long都是32位,long long是64位,但是学Windows的时候现实告诉我too young too simple。
于是乎,我貌似找到答案了:
short至少为16位;int至少和short一样长;long至少为32位,且至少和int一样长;long long至少为64位,且至少和long一样长
16 bits <= short <= int <= long <= long long && long >= 32 bits && long long >= 64bits
而头文件<climits>中记录着这一类信息,如INT_MAX、INT_MIN、SHRT_MAX、LONG_MAX、LLONG_MAX、CHAR_BIT等。
贴代码一观
#include <iostream>
#include <climits>
using std::cout;
using std::endl;
int main()
{
cout << "max int : " << INT_MAX << " with bytes count = " << sizeof(int) << endl;
cout << "min int : " << INT_MIN << " with bytes count = " << sizeof(int) << endl;
cout << "max short : " << SHRT_MAX << " with bytes count = " << sizeof(short) << endl;
cout << "max long : " << LONG_MAX << " with bytes count = " << sizeof(long) << endl;
cout << "max long long : " << LLONG_MAX << " with bytes count = " << sizeof(long long) << endl;
cout << "bits count per byte : " << CHAR_BIT << endl;
getchar();
}
Windows 7 64位上的输出是
而unsigned只是限定符,对类型的大小并没影响,只是对应表示区域有所不同
而当我们在代码
cout << 192 << endl;
中,编译器如何为192分配空间即编译器认为192是什么类型的呢?
结果是除非显式告知存储类型或者值太大不可以存储为int,int都是default选项。
显式告知可以用后缀来实现,例如192L为long,192[uU][lL]或者192[lL][uU]为unsigned long,其他类型不一一赘述。
浮点数一向以来我都觉得比较坑,虽说只有float和double,如果不算上一般不用到的long double。
一般规则是 32bits <= float <= double <= long double && double >= 48 bits,但是一般都是float为32位,double为64位,long double为80,96或者128 ,可以在头文件<cfloat>里面找到相关定义。
是否掌握基本类型的存储并不会对你的编程产生很大的影响(对于ACM的孩纸就是坚决有影响的了),但是作为一个钟爱操作系统的孩纸,我觉得这些知识很至关重要,可以尽可能地节省空间,提高运算速度,增强程序的可移植性。