3.1.3整型
- short 至少16位;
- int 比 short长;
- long 至少32位;且至少与int一样长;
- longlong 至少64位;且至少与long一样长;
头文件climits中包含了关于整型限制的信息,具体来说它定义表示各种限制负号名称,例如,INT_MAX为int的最大取值,CHAR_BIT是字节的位数。
//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;
}