2.1 C++基本内置类型

算术类型

  • 算术类型分为两类:整型和浮点型
  • 算术类型的尺寸在不同机器上有所差别。下图列出了c++标准规定的尺寸的最小值,同时允许编译器赋予这些类型更大的尺寸。某一类型所占的比特数不同,它所表示的数据范围也不一样。
  • 除字符类型和布尔类型外,其它整型用于本身不同尺寸的整数。c++语言规定一个int至少和一个short一样大,一个long至少和一个int一样大,一个long long至少和一个long一样大。
  • 大多数计算机以2的整数次幂个比特作为块来处理内存,可寻址的最小内存块称为“字节byte”,存储的基本单元称为“字word”,它通常由几个字节组成。在c++语言中,一个字节至少能容纳机器基本字符集中的字符。大多数机器的字节由8比特构成,字则由32或64比特构成,也就是4或8字节。
  • 浮点型可表示单精度、双精度和扩展精度。c++标准指定了一个浮点数有效位数的最小值,然而大多数编译器都实现了更高的精度。通常,float以1个字(32比特)来表示,double以2个字来表示,long double 以3或4个字来表示。
    在这里插入图片描述

带符号类型和无符号类型

  • 除去布尔型和扩展的字符型外,其他整型可以划分为带符号的(signed)和无符号的(unsigned)两种。带符号类型可以表示正数、负数或0,无符号类型则仅能表示大于等于0的值。
  • 类型int、short、long和long long都是带符号的,通过在这些类型名前添加unsigned就可以得到无符号类型,如unsigned long。类型unsigned int可以缩写为unsigned。
  • 与其它整型不同,字符型被分为了三种:char、signed char和unsigned char
    • 类型char和类型signed char并不一样。尽管字符型有三种,但是字符的表现形式却只有两种,带符号的和无符号的。
    • 类型char实际上会表现为上述两种形式中的一种,具体是哪种由编译器决定。
    • 无符号类型中所有的比特都用来存储值。如8比特的unsigned char可以表示0到255区间内的值。
    • c++标准并没有规定带符号类型应如何表示,但是约定了在表示范围内正值和负值的量应该平衡。因此,8比特的signed char理论上应该可以表示为-127到127区间内的值,大多数现代计算机将实际的表示范围定为-128至127.

建议:如何选择类型
1、当明确知晓数值不可能为负时,选用无符号类型
2、使用int执行整数运算。在实际应用中,short通常显得太小而long一般和int有一样的尺寸。如果数据超过了int的范围,选择long long
在算术表达式中不要使用char或bool,只有在存放字符或布尔值才使用它们。因为类型char在一些机器上是有符号的,而在另一些机器上又是无符号的,所以使用char进行运算容易出问题。
执行浮点数选用double。这是因为float通常精度不够且双精度浮点数和单精度浮点数的计算代价相差无几。实际上,对于某些机器而言,双精度甚至比单精度还快。

类型转换

  • 当在程序的某处使用了一种类型而其实对象应该取另一种类型时,程序会自动进行类型转换。
  • 类型所能表示的值的范围决定了转换的过程
    • 赋给无符号类型的一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。例如,8比特大小的unsigned char可以表示0到255区间内的值,如果赋予了一个区间外的值,则实际结果是该值对256取模后所得的余数。因此,将-1赋值给8比特大小的unsigned char所得的结果是255.
    • 当我们赋给带符号类型的一个超出它表示范围的值时,结果是未定义的。此时,程序可能继续工作、可能崩溃,也可能生成垃圾数据。

含有无符号类型的表达式

  • 尽管我们不会故意给无符号对象赋一个负值,却可能写出这样的代码。如将一个算术表达式中既有无符号数又有int值时,那个int值就会转换成无符号数。
unsigned u = 10;
int i = -42;
cout<< i + i << endl;//输出-84
cout<< u + i << endl;//如果int占32位,输出4294967264
  • 在第二个表达式中,相加前先把整数-42转化为无符号数。把负数转化为无符号数类似于直接给无符号数赋一个负值,结果等于这个负数加上无符号数的模。

  • 当从无符号数中减去一个值时,不管这个值是不是无符号数,都必需保证结果不是一个负值

unsigned u1 = 42, u2 = 10;
cout<<u1 - u2<<endl;//正确,输出32
cout<<u2 - u1<<endl;//正确,输出的是取模后的值

不要混用带符号类型和无符号类型
如果表达式中既有带符号类型又有无符号类型,当带符号类型取值为负时会出现异常结果,这是因为带符号数会自动地转换成无符号数。

字面值常量

  • 整型字面值具体的数据类型由它的值和符号决定。
    • 默认情况下,十进制字面值是带符号数,八进制和十六进制字面值既可能是带符号的也可能是无符号的。
    • 十进制字面值的类型是int、long、和long long中尺寸最小的那个。
    • 八进制和十六进制字面值类型是能容纳其数值的int、unsigned int、long、unsigned long、long long和unsigned long long中的尺寸最小者。
    • 类型short没有对应的字面值。
  • 字符和字符串字面值
    • 由单引号括起来的一个字符称为char型字面值,双引号括起来的零个或多个字符构成字符串型字面量
    • 字符串字面值的类型实际上是由常量字符构成的数组。编译器在每个字符串的结尾处添加一个空字符’\0’,因此,字符串字面值的实际长度要比它的内容多1.
    • 如果两个字符串字面值位置紧邻且仅由空格、缩进和换行符分隔,则它们实际上是一个整体。当书写的字符串字面值比较长,写在一行不太合适,可采取分开书写的方式。
'a'//字符字面值
"Hello, world!"//字符串字面值
//分开书写的方式
std::cout<<"a really, really long string literal"
		   "that spans two lines"<<std::endl;
  • 转义序列
    • 有两类字符程序员不可直接使用
      • 一类是不可打印的字符,如退格或其它控制字符,因为它们没有可视的图符
      • 另一类是在c++语言中有特殊含义的字符(单引号、双引号、问号、反斜线)。在这种情况下要用到转义序列,转义序列均以反斜线作为开始,c++规定的转义序列如下

在这里插入图片描述

  • 布尔字面值
    • true和false
  • 指针字面值
    • nullptr
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值