您的位置:首页 > 编程语言 > C语言/C++

C++彻底研究之内置类型

2009-07-29 09:10 169 查看
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;
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;
}
 

 
结果如下:

 


    从结果可知,系统的机器字长为int类型的长度,即4个字节(32位),在32位机器字长情况下,long类型与int类型的长度相同,皆为4个字节(32位)。 
 
2. 整型的赋值
  当将一个超过类型范围的数值赋与该类型变量时,如何取舍取决于这种类型是unsigned还是signed。
然而对于大多数的编译器,不管是signed类型还是unsigned类型,它们共同的措施是对该值求模,然后取所得值。
示范代码:
 
 

#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
    int i = 0;
    i = 1000000000000000;
    cout<<"i = "<<i<<endl;
    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

           
最后附上图片作为总结:


 
注:图片来自互联网
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息