基本数据类型

1. 变量命名规则

C++命名规则:

  • 在名称中只能使用字母字符、 数字和下划线(_)。

  • 名称的第一个字符不能是数字。

  • 区分大写字符与小写字符。不能将C++关键字用作名称

如果想用两个或更多的单词组成一个名称, 通常的做法是用下划线字符将单词分开, 如my_onions; 或者从第二个单词开始将每个单词的第一个字母大写, 如myEyeTooth  

2. 整型变量

2.1 整型

整数就是没有小数部分的数字, 如298-52860不同C++整型使用不同的内存量来存储整数。C++的基本整型(按宽度递增的顺序排列)分别是charshortintlongC++11新增的long long,其中每种类型都有符号版本和无符号版本,因此总共有10种类型可供选择。  

计算机内存由一些叫做位(bit) 的单元组成 。 C++shortintlonglong long类型通过使用不同数目的位来存储值,最多能够表示4种不同的整数宽度。 

  • short至少16位;

  • int至少与short一样长;

  • long至少32位, 且至少与int一样长;

  • long long至少64位, 且至少与long一样长。 

4种类型(intshortlonglong long) 都是符号类型,这意味着每种类型的取值范围中,负值和正值几乎相同。例如,16位的int的取值范围为-32768+32767。 头文件climits(在老式实现中为limits.h)中包含了关于整型限制的信息。

符 号 常 量 表 示
CHAR_BIT char的位数
CHAR_MAX char的最大值
CHAR_MIN char的最小值
SCHAR_MAX signed char的最大值
SCHAR_MIN signed char的最小值
UCHAR_MAX unsigned char的最大值
SHRT_MAX short的最大值
SHRT_MIN short的最小值
USHRT_MAX unsigned short的最大值
INT_MAX int的最大值
INT_MIN int的最小值
UNIT_MAX unsigned int的最大值

LONG_MAX long的最大值
LONG_MIN long的最小值
ULONG_MAX unsigned long的最大值
LLONG_MAX long long的最大值
LLONG_MIN long long的最小值
ULLONG_MAX unsigned long long的最大值

2.2 无符号类型

前面介绍的4种整型都有一种不能存储负数值的无符号变体,其优点是可以增大变量能够存储的最大值。要创建无符号版本的基本整型, 只需使用关键字unsigned来修改声明即可: 

unsigned short change; // unsigned short type
unsigned int rovert;   // unsigned int type
unsigned quarterback;  // also int type\unsigned本身是unsigned int的缩写。
unsigned long gone;    // unsigned long type
unsigned long long lang_lang; // unsigned long long type

2.3 整型字面值

C++能够以三种不同的计数方式来书写整数:基数为10、基数为8和基数为16C++使用前一(两)位来标识数字常量的基数。

  • 如果第一位为19,则基数为10(十进制),因此93是以10为基数的。

  • 如果第一位是0,第二位为17,则基数为8(八进制),因此042的基数是8, 它相当于十进制数34

  • 如果前两位为0x0X,则基数为16(十六进制),因此0x42为十六进制数,相当于十进制数66。对于十六进制数,字符afAF表示了十六进制位,对应于10150xF150xA5165101651)。   

如果要以十六进制或八进制方式显示值,则可以使用cout的一些特殊特性。前面指出过,头文件iostream提供了控制符endl,用于指示cout重起一行。同样,它还提供了控制符dechexoct,分别用于指示cout以十进制、十六进制和八进制格式显示整数。 

int chest = 42;
int waist = 42;
int inseam = 42;
cout << chest << endl; // 42
cout << hex;
cout << waist << endl; // 2a,制符hex实际上是一条消息,告诉cout采取何种行为。
cout << oct;
cout << chest << endl; // 52

3. char类型 

char类型是专为存储字符(如字母和数字) 而设计的。 现在, 存储数字对于计算机来说算不了什么, 但存储字母则是另一回事。 编程语言通过使用字母的数值编码解决了这个问题。 因此,char类型是另一种整型,虽然char最常被用来处理字符,但也可以将它用做比short更小的整型。

4. bool类型

ANSI/ISO C++标准添加了一种名叫bool的新类型

bool is_ready = true;

字面值truefalse都可以通过提升转换为int类型, true被转换为1,而false被转换为0 

int ans = true; // 1
int promise = false; // 0

5. 浮点数

使用浮点类型可以表示诸如2.53.14159122442.32这样的数字,即带小数部分的数字。计算机将这样的值分成两部分存储。一部分表示值,另一部分用于对值进行放大或缩小。  

例如:对于数字34.124534124.5,它们除了小数点的位置不同外,其他都是相同的。可以把第一个数表示为0.341245(基准值)和100(缩放因子),而将第二个数表示为0.341245(基准值相同)和10000(缩放因子更大) 

4.1 书写浮点数

C++有两种书写浮点数的方式。 第一种是使用常用的标准小数点表示法:

  • 12.34

  • 939001.32

  • 0.00023

  • 8.0

第二种表示浮点值的方法叫做E表示法, 其外观是像这样的: 

  • 3.45E6,这指的是3.451000000相乘的结果,E6指的是106次方, 即1后面60 

因此,3.45E6表示的是34500006被称为指数,3.45被称为尾数。指数可以是正数也可以是负数。然而,数字中不能有空格,因此7.2 E6是非法的。

4.2 浮点类型

C++有3种浮点类型:float、double和long double。这些类型是按它们可以表示的有效数位和允许的指数最小范围来描述的。

  • float至少32位

  • double至少48位, 且不少于float

  • long double至少和double一样多

这三种类型的有效位数可以一样多。然而,通常,float为32位,double为64位,long double为80、96或128位。 

4.3 浮点常量

在程序中书写浮点常量的时候,程序将把它存储为哪种浮点类型呢?

在默认情况下,像8.242.4E8这样的浮点常量都属于double类型。如果希望常量为float类型,请使用fF后缀。对于long double类型,可使用 l L 后缀。

1.234f        // a float constant
2.45E20F      // a float constant
2.345324E28   // a double constant
2.2L          // a long double constant

5. 类型转换

C++丰富的类型允许根据需求选择不同的类型, 这也使计算机的操作更复杂。因此计算机需要处理大量不同的情况,尤其是对不同的类型进行运算时。为处理这种潜在的混乱,C++自动执行很多类型转换:

  • 将一种算术类型的值赋给另一种算术类型的变量时,C++将对值进行转换;

  • 表达式中包含不同的类型时,C++将对值进行转换;

  • 将参数传递给函数时,C++将对值进行转换。  

5.1 初始化和赋值进行的转换 

C++允许将一种类型的值赋给另一种类型的变量。这样做时,值将被转换为接收变量的类型。 

例如, 假设so_long的类型为longthirty的类型为short,而程序中包含这样的语句: 

so_long = thirty;

则进行赋值时,程序将thirty的值(通常是16位)扩展为long值(通常为32位)。扩展后将得到一个新值,这个值被存储在so_long中,而thirty的内容不变。

下面列出了一些可能出现的转换问题:

转换 潜在的问题
将较大的浮点类型转换为较小的浮点类型, 如将double转换为float 精度(有效数位) 降低, 值可能超出目标类型的取值范围, 在这种情况下, 结果将是不确定的
将浮点类型转换为整型 小数部分丢失, 原来的值可能超出目标类型的取值范围, 在这种情况下, 结果将是不确定的
将较大的整型转换为较小的整型, 如将long转换为short 原来的值可能超出目标类型的取值范围, 通常只复制右边的字

5.2 以{ }方式初始化时进行的转换(C++11) 

C++11将使用大括号的初始化称为列表初始化,因为这种初始化常用于给复杂的数据类型提供值列表,类型转换的要求更严格。

具体地说,列表初始化不允许缩窄,即变量的类型可能无法表示赋给它的值。例如,不允许将浮点型转换为整型。在不同的整型之间转换或将整型转换为浮点型可能被允许,条件是编译器知道目标变量能够正确地存储赋给它的值。例如,可将long变量初始化为int值,因为long总是至少与int一样长;相反方向的转换也可能被允许, 只要int变量能够存储赋给它的long常量: 

5.3  表达式中的转换 

当同一个表达式中包含两种不同的算术类型时,将出现什么情况呢?在这种情况下,C++将执行两种自动转换:首先,一些类型在出现时便会自动转换;其次, 有些类型在与其他类型同时出现在表达式中时将被转换。

编译器通过校验表来确定在算术表达式中执行的转换:

  • 如果有一个操作数的类型是long double,则将另一个操作数转换为long double。

  • 否则,如果有一个操作数的类型是double,则将另一个操作数转换为double。 

  • 否则, 如果有一个操作数的类型是float,则将另一个操作数转换为float

  • 否则, 说明操作数都是整型, 因此执行整型提升。

  • 在这种情况下,如果两个操作数都是有符号或无符号的,且其中一个操作数的级别比另一个低, 则转换为级别高的类型。 

  • 如果一个操作数为有符号的,另一个操作数为无符号的,且无符号操作数的级别比有符号操作数高, 则将有符号操作数转换为无符号操作数所属的类型。

  • 否则,如果有符号类型可表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属的类型。

  • 否则,将两个操作数都转换为有符号类型的无符号版本。   

5.4 传递参数时的转换 

5.5 强制类型转换 


 
 
 


 

 

posted @ 2024-04-24 20:00  小熊酱  阅读(4)  评论(0编辑  收藏  举报