C++ Pimer:2.1 基本内置类型

其他章节:C++ Primer 学习心得

C++定义了一套包括算术类型和空类型(void)在内的基本数据类型,其中算数类型包含字符、整型数和浮点数。空类型不对应具体的值,仅用于一些特殊场合,当函数不返回任何值时使用空类型作为返回类型。

算术类型

  • 分为两类:整型(包括charbool在内)和浮点型。
含义
最小尺寸
bool
布尔类型未定义
char
字符8位
wchar_t
宽字符16位
char16_t
Unicode字符16位
char32_t
Unicode字符32位
short
短整型16位
int
整形16位
long
长整型32位
longlong长整型64位
float
单精度浮点数6位有效数字
double
双精度浮点数10位有效数字
long double扩展精度浮点数10位有效数字
Bool
  • 取值是真(true)或假(false)。
字符
  • 基本的字符类型是char,大小与一个机器字节一样。
整型
  • 一个int至少和一个short一样大;
  • 一个long至少和一个int一样大;
  • 一个long long至少和一个long一样大。
浮点型
  • 浮点型可以表示单精度、双精度和扩展精度值。
  • C++标准指定了浮点数的有效位数的最小值,大多编译器实现了更高的精度。
    • float以32bit来表示;
    • double以64bit来表示;
    • long double以96或128bit来表示
  • 一般地,floatdouble分别有7和16个有效位。

带符号数和无符号类型

  • bool与扩展的字符型外,其他整型可以划分为带符号(signed)和无符号(unsigned);
  • 带符号类型可以表示整数、负数和0,无符号类型仅能表示大于等于0的值。
  • intshortlonglong long都是带符号的,类型名前加unsigned即可得到无符号类型。
  • 无符号类型中的所有bit都用来储值,带符号类型存在符号位。
字符型
  • 字符型被分为三种,charsigned charunsigned char
  • charsigned char不同,字符的表现形式只有两种:带符号与无符号,由编译器决定类型char表示为哪一种。
类型选择
  • 明确知晓数值不为负,选择无符号类型。
  • 一般longint有相同的大小,超出int的表示范围,选用long long
  • 算数表达式不用charbool,只有存放字符或Bool值才使用。
  • char在一些机器上有符号(一些没有),使用不大的整数明确指明signed char或者unsigned char
  • 浮点数运算选用doublefloat精度不够且计算代价相差较小,一些机器双精度运算更快,long double一般不必要。

类型转换

当程序中使用了一种类型而其实对象应该取另一种类型时,程序会自动进行类型转换。

bool
  • bool类型的算术值赋值给bool类型时,初始值为0结果为false,否则结果为true
  • bool型赋值为非bool类型时,初始值false结果为0,初始值true结果为1
浮点数
  • 浮点数赋值给整数,仅保留浮点数的整数部分。
  • 整数赋值给浮点数,小数部分记为0,如果整数所占空间超过了浮点类型的容量,精度可能会有损失。
符号类型
  • 给无符号类型赋值一个超出范围的值,结果是初始值对无符号类型表示数值总数取模后的余数。
  • 给带符号类型赋值一个超出范围的值,结果是未定义

含有无符号类型的表达式

  • 一个算数表达式既有无符号数又有int值时,int值就会自动转换为无符号数。
  • 无符号数减去一个值,不管是否为无符号数,都必须确保结果不是负值。
unsigned u1 = 42, u2 = 10;
u1 - u2 // 正确 32;
u2 - u1 // 正确 结果取模
  • 无符号数不会小于0,影响循环写法:
// u不会小于0,循环一直成立
for (unsigned u =10, u >= 0; --u)
	std::cout << u << std::endl; 
// while语句代替for语句
unsigned u == 11; // 确定最大数,从比它大1的数开始
while (u > 0){
	--u;
}
  • 不要混用带符号类型与无符号类型,当带符号类型取值为负时会出现异常的结果,带符号数自动转换成无符号数。

字面型常量

每个字面值常量对应一种数据类型,字面值常量的形式和值决定它的数据类型。

整型和浮点型字面值

  • 整型字面值可以写作十进制、八进制和十六进制。
    • 0开头——八进制数;
    • 0x0X开头——十六进制数;
    • 十进制字面值是带符号数,八进制与十六进制字面值可能带符号也可能无符号。
    • 十进制字面值的类型是intlonglong long 中尺寸最小的那个(例如,三者当中最小是 int),前提是这种类型要能容纳下当前的值。
    • 八进制和十六进制字面值的类型是能容纳其数值的intunsigned intlongunsigned longlong longunsigned long long中的尺寸最小者。
    • 如果一个字面值连与之关联的最大的数据类型都放不下,将产生错误。
    • 类型 short 没有对应的字面值。
    • 十进制的字面值不会是负数,负号不在字面值中,仅对字面值取负数。
  • 浮点型字面值为一个小数或以科学技术法表示的指数,指数用E或e表示。
    • 浮点型字面值是一个double。

字符和字符串字面值

  • 单引号括起来的一个字符称为char型字面值,双引号括起来的零个或多个字符构成字符串型字面值。
  • 字符串字面值的类型是常量字符构成的数组(array)。
  • 编译器在每个字符串结尾处添加一个空字符(\0),字符串字面值的实际长度比内容多1。
  • 如果两个字符串字面值位置紧邻且仅有空格、缩进和换行符分隔,实际上是一个整体。
    • 字符串字面值较长,写在一行不合适时,可以采取分开书写的方式。

转义序列

不能直接使用的字符:

  • 不可打印字符,如退格或其他控制字符,没有可视的图符;
  • C++语言有特殊含义的字符——转义序列
转义字符
  • 换行符 \n
  • 横向制表符 \t
  • 报警符 \a
  • 纵向制表符 \v
  • 退格符 \b
  • 双引号 \''
  • 反斜线 \\
  • 问号 \?
  • 单引号 \'
  • 回车符 \r
  • 进纸符 \f
泛化序列
  • \x后紧跟1个或多个十六进制数字,\x用到后面跟着的所有数字。
  • \后紧跟1个、2个或3个八进制数字,超过3个则只有前3个与\构成转义序列。

指定字面值的类型

字符和字符串字面值
前缀含义类型
uUnicode16字符char16_t
UUnicode32字符char32_t
L宽字符wchar_t
u8UTF-8(仅用于字符串字面常量)char
整形字面值
后缀最小匹配类型
u or Uunsigned
l or Llong
ll or LLlong long
  • 使用长整型字面值时,使用大写字母L标记,小写字母l与数字1容易混淆。
浮点型字面值
后缀类型
f or Ffloat
l or Llong double
  • U为后缀的十进制数、八进制数或十六进制数都将从unsigned intunsigned longunsigned long long中选择能匹配的空间最小的一个作为其数据类型。
  • 如果后缀中有L,则字面值的类型至少是 long;如果后缀中有 LL,则字面值的类型将是 long longunsigned long long 中的一种。
  • 可以将ULLL合在一起使用。以UL为后缀的字面值的数据类型将根据具体数值情况或者取unsigned long,或者取unsigned long long
bool字面值和指针字面值
  • truefalsebool类型的字面值;
  • nullptr是指针字面值。
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值