3.1.3整型
//limits.cpp #include<iostream> #include<climits> int main() { using namespace std; int n_int = INT_MAX; short n_short = SHRT_MAX; long n_long = LONG_MAX; long long n_llong = LLONG_MAX; cout << "int is " << sizeof(int) << " bytes." << endl; cout << "short is " << sizeof n_short << " bytes." << endl; cout << "long is " << sizeof n_long << " bytes." << endl; cout << "long long is " << sizeof n_llong << " bytes." << endl; cout << endl; cout << "Maximum values:" << endl; cout << "int:" << n_int << endl; cout << "short:" << n_short << endl; cout << "long:" << n_long << endl; cout << "long long :" << n_llong << endl << endl; cout << "Minimum int value =" << INT_MAX << endl; cout << "Bits per byte = " << CHAR_BIT << endl; return 0; }
运算符sizeof.
sizeof运算符指出,在使用8位字节的系统中,int的长度为4个字节。对类型名(如int)使用sizeof 运算符时,应将名称放在括号中;但对变量名(如 n_short)使用该运算符,括号是可选的:
cout<<"int is "<< sizeof(int)<<“bytes.”<<endl;
cout<<“short is”<<sizeof n_short<<“bytes.”<<endl;
预处理器define
#define INT_MAX 32767
该编译指令告诉预处理器:在程序中查找INT_MAX,并将所有的INT_MAX换成32767
3.1.4 无符号类型
前面介绍的4种整型都有一种不能存储负数值的无符号变体。其优点是可以增大变量能够存储的最大值。
例如,如果short表示的范围为-32768到+32767,则无符号版本的表示范围是0-65535.当然当且仅当数值不会为负时才应使用无符号类型,如人口、粒数等。
//exceed.cpp #include<iostream> #define ZERO 0 //make ZERO symbol for 0 value #include<climits> int main() { using namespace std; short sam = SHRT_MAX;//initialize a variable to max value unsigned short sue = sam; cout << "Sam has " << sam << " dollars and Sue has " << sue; cout << " dollars deposited." << endl << " Add $1 to each account." << endl << "NOW "; sam = sam + 1; sue = sue + 1; cout << "Sam has " << sam << " dollars." << endl << "And Sue has " << sue << " dollars deposited.\nPoor Sam!"<<endl; sam = ZERO; sue = ZERO; cout << "Sam has " << sam << " dollars and Sue has " << sue; cout << " dollars deposited." << endl << "Lucky Sue!" << endl; return 0; }
== 该程序将一个short变量(sam)和一个unsigned short 变量(sue)分别设置为最大的short值,在我们的系统上,是32767。然后将这些变量的值都加1。对sue来说无问题,但sam的值从32767变成了-32768!同样对于sam,将其设置为0减去1也不会有问题,但是对于无符号sue,其值设为0减1,变为了665535。==
3.1.6整型字面值
c++ 使用前一两位来标识数字常量的基数。
如果第一位为1~9,则基数为10,即十进制;因此93是以10为基数的。如果第一位是0,第二位是1-7,则基数为8,因此042基数是8,它相当于十进制数34。如果前两位为0X,则基数为16,且在16进制中A-F,分别对应于10-15。因此0xa5为165。
在默认情况下cout以十进制格式显示整数。
//hexoct1.cpp #include<iostream> int main(){ using namespace std; int chest = 42;//十进制 int waist = 0x42;//十六进制 int inseam = 042;//8进制 cout<<"Monsieur cuts a striking figure!\n"; cout<<"chest = "<<chest<<"(42 in demical)\n"; cout<<"waist = "<<waist<<"(0x42 in hex)\n"; cout<<"inseam = "<<inseam<<"(042 in octal)\n"; return 0; }
输出:chest=42
waist=66
inseam=34
cout还提供了控制符dec、hex、oct,分别用于指示cout以十进制、十六进制和八进制格式显示整数。
//hexoct2.cpp #include<iostream> using namespace std; int main() { int chest = 42; int waist = 42; int inseam = 42; cout << "Monsieur cuts a striking figure!" << endl; cout << "chest= " << chest << " (demical for 42)" << endl; cout << hex; cout << "waist= " << waist << " (hexademical for 42)" << endl; cout << oct; cout << "inseam= " << inseam << " (octal for 42)" << endl; return 0; }
诸如cout<<hex;等代码不会在屏幕上显示任何内容,而只是修改cout显示整数的方式。
3.1.7 C++如何确定常量类型
后缀是放在数字后面的字母,用来表示类型。
整数后面的 l 或者 L 表示该整数为 long 常量
u 或者 U 表示 unnsigned int 常量
ul表示 unsigned long 常量
C++11还提供了用来表示long long类型的后缀 ll 和 LL ,还提供了表示 unsigned long long
的后缀ull,uLL,和ULL关于长度:
在C++中对于不带后缀的十进制整数,将使用下面几种能够存储概述的最小整型来表示:int long 或者long long 。
在int 为16位,long 为32位的计算机系统中,20000被表示为int类型,40000被表示为long
类型3000000000被表示为long long类型对于不带后缀的十六进制或八进制整数,将使用下面能够存储该数的最小整型来表示:int , unsigned int long,unsigned
long, long long或者unsigned long long 来表示。
在将40000表示为long 的计算机系统中 十六进制数0x9C40(40000)将被表示为unsigned
int。这是因为十六进制的常用来表示内存地址,而内存地址没有符号。
原文链接:https://blog.csdn.net/lishuzhai/article/details/5056
***3.1.8 char类型:字符和小数
char 是专门用来存储字符(如字母和数字)而设计的。
//chartype.cpp #include<iostream> int main() { using namespace std; char ch; //declare a char variable cout << "Enter a character:" << endl; cin >> ch; cout << "Thank you for " << ch << " character." << endl; return 0; }
若输入M,输入时,cin将键盘输入的M转换为77(ASCII码);输出时,cout将值77转换为所显示的字符M;cin和cout的行为都是由变量类型来引导的。如果将77纯粹在int变量中,则cout将值.77转换为所显示字符77。
//morechar.cpp #include<iostream> using namespace std; int main() { char ch = 'M';//assign ASCII code fir M to ch int i = ch;//store same code in an int cout << "The ASCII code for " << ch << " is " << i << endl; cout << "Add one to the character code: " << endl; ch = ch + 1;//change character code in ch i = ch;// save new character code in i cout << "The ASCII code for " << ch << " is " << i << endl; cout.put(ch);//using the cout.put function to display a char cout.put('!'); cout << endl << "Done" << endl; return 0; }
程序说明
‘M’(加了单引号)表示字符M的数值编码,因此将char变量ch初始化为‘M’,将把ch 设置为77。然后,程序将同样的值赋给int变量i,这样ch和i的值都是77。接下里cout将ch显示为M,而把i显示为77。
cout.put()成员函数,该函数显示一个字符。
3.3 浮点数
类型:float、double、long double。
cout.setf()函数限定程序显示到小数点后六位。
//floatnum.cpp #include<iostream> int main() { using namespace std; cout.setf(ios_base::fixed, ios_base::floatfield);//参数ios_base::fixed, ios_base::floatfield是通过iostream来提供的常量 float tub = 10.0 / 3.0; double mint = 10.0 / 3.0; const float million = 1.0e6; cout << "tub = " << tub; cout << ",a million tubs = " << million * tub; cout << ",\hand ten million tubs = "; cout << 10 * million * tub << endl; cout << " mint = " << mint << "and a million mints = "; cout << million * mint << endl; return 0; }
由于cout打印6位小数,因此tub和mint都是精确的。但当程序将每个数乘以一百万后,tub在第7个3之后就与正确的值有了误差。tub在6位有效位上还是精确的。所以他乘以1百万显示的是由误差的(在第7个3之后就与正确的值有了误差)。double类型的变量显示了13个3,因此它至少有13位是精确的。
3.4.4 类型转换
1.初始化和赋值进行的转化(略)
2.以{ }方式初始化时进行转换
唯一的不同就是不允许由精度高的向精度低的转换,不允许浮点型向整型转换。
int x = 66; char c4 = {x};/是不被允许的
在上述代码中,初始化C4时,x的值是66,但是在编译器看来,x是一个变量,其值很大。(从x被初始化为66到它被用来初始化c4)这件事编译器是不会跟踪的,即不会做到。
3.强制转换
-格式一:
value (typename) // converts value to typename type
-格式二:
static_cast(thorn) //returns a type long conversion of thorn
就是将thorn转换为long的类型。
通用static_cast(value)
//typecast.cpp #include<iostream> int main() { using namespace std; int auks,coots; auks = 19.99 + 11.99; coots = int(19.99) + int(11.99); cout << "auks = " << auks << " , coots = " << coots << endl; char ch = 'Z'; cout << "The code for " << ch << " is " << int(ch) << endl; cout << "Yes,the code is " << static_cast<int>(ch); return 0; }