1. 类型的存储
C++本身定义的类型(算术类型)包括:整数、浮点数、单个字符和布尔值,以及void特殊类型。
系统存储这些类型占用不同的内存空间:
C++:算术类型 | ||
---|---|---|
类型 | 含义 | 最小存储空间 |
bool char wchar_t short int long float double long double | 布尔值 字符型 宽字符型 短整型 整型 长整型 单精度浮点型 双精度浮点型 扩展精度浮点型 | —— 8位 16位 16位 16位 32位 6位有效数字 10位有效数字 10位有效数字 |
这里有几个值得注意的地方:
- 通常将8位作为一个字节,32位或4个字节作为一个“字(word)”。
- 一般,short类型为半个机器字长,int类型为一个机器字长,而long类型最为特殊,当机器位为32位时,ling与int具有相同的位数,即一个字长(32位),其他情况为两个机器字长;
- 一般float类型为一个字(32位),double类型为两个字(64位),long double类型为三个或四个字(96或128位)。
- 0值代表false,非0值代表true。
示范代码:
#include
<iostream>
using namespace std;
using namespace std;
int
main(int argc, char *argv[])
{
short int s = 0;
int i = 0;
long l = 0;
cout<<"short:"<<sizeof(s)<<endl;
cout<<"int:"<<sizeof(i)<<endl;
cout<<"long:"<<sizeof(l)<<endl;
return 0;
}
{
short int s = 0;
int i = 0;
long l = 0;
cout<<"short:"<<sizeof(s)<<endl;
cout<<"int:"<<sizeof(i)<<endl;
cout<<"long:"<<sizeof(l)<<endl;
return 0;
}
结果如下:
从结果可知,系统的机器字长为int类型的长度,即4个字节(32位),在32位机器字长情况下,long类型与int类型的长度相同,皆为4个字节(32位)。
2. 整型的赋值
当将一个超过类型范围的数值赋与该类型变量时,如何取舍取决于这种类型是unsigned还是signed。
然而对于大多数的编译器,不管是signed类型还是unsigned类型,它们共同的措施是对该值求模,然后取所得值。
示范代码:
#include
<iostream>
using namespace std;
using namespace std;
int
main(int argc, char *argv[])
{
int i = 0;
{
int i = 0;
i = 1000000000000000;
cout<<"i = "<<i<<endl;
return 0;
}
return 0;
}
结果如下:
3. 类型转换
3.1 赋值运算转换
在赋值操作中,由于不可能更改做操作数对象的类型,因此,左操作数的类型占了主导。如果赋值操作的左右操作数类型不相同,则右操作数类型被强制转换为左操作数类型。
比如:
int
ivar = 0;
float
fvar = 0.1f;
double
dvar = 1.01;
ivar
= dvar; //dvar转换(截断)为整型
fvar = dvar; //dvar转换(截断)为浮点型
3.2 算术运算转换
这种运算的转换一般满足:整型提升原则。所有比int类型小的类型:char、unsigned char、signed char、short、unsigned short,若int类型能包容它们,则将转换为int类型,若int类型不能包容,则转换为unsigned int类型。同理,若bool值转换为int,则false转换为0,true转换为1。
对于unsigned类型和signed类型的转换是值得我们注意的。
short类型将直接转换为int类型;若int类型能够包容unsigned short类型,则unsigned short类型被转换为int类型,若不包容,根据整型提升原则,unsigned short类型转换为unsigned int类型。
同理,long类型与unsigned int类型的转换是一样的。
有一个特殊的地方值得我们注意。表达式中signed型数值会被转换为unsigned型。
例如:
int
ivar;
float
fvar;
double
dvar; char cvar; short svar; long lvar;
bool
flag; unsigned short usvar; unsigned int uivar; unsigned long ulvar;
3.14159L + 'a' //'a'先转换为int型,然后再转换为long double
ivar
+ dvar; //int 转换为double
fvar + dvar; //float转换为double
flag = dvar; //若dvar为0,则flag为false,否则flag为true
cvar + fvar; //cvar转换为int,然后int转换为float
svar + cvar;
//svar和cvar都转换为int
cvar + lvar;
//cvar转换为int,然后int转换为long
ivar + ulvar;
//ivar转换为unsigned long
usvar + ivar;
//取决于int类型能否包容unsigned short
uivar + lvar;
//取决于long类型能否包容unsigned int
最后附上图片作为总结:
注:图片来自互联网