- 算术类型在不同的机器上有尺寸有所差别
类型 | 含义 | 最小尺寸 |
---|---|---|
bool | 布尔类型 | 未定义 |
char | 字符 | 8位 |
wchar_t | 宽字符 | 16位 |
char16_t | Unicode字符 | 16位 |
char32_t | Unicode字符 | 36位 |
short | 短整型 | 16位 |
int | 整形 | 16位 |
long | 长整型 | 32位 |
long long | 长整型 | 64位 |
float | 单精度浮点数 | 6位有效数字 |
double | 双精度浮点数 | 10位有效数字 |
long double | 扩展精度浮点数 | 10位有效数字 |
除了char的一些扩展其他都在C里面学习过
char 的空间可确保存放机器基本字符集中任意字符。
其他字符用于扩展字符集。
- 类型转换
#include <iostream>
int main(void)
{
bool b = 42; //为真。初始值负0才为假
int i = b; //i = 1; 当把布尔值给非布尔值是。初始为0,结果为false。为true则1
i = 3.14; //i = 3; 直接截断了
double pi = i; //pi = 3.0 进行类型转换
unsigned char c = -1; //c = 255; 无符号类型没有负数。8比特的char赋给他负数就是。1 % 256的余数
signed char c2 = 256;//超出都是未定义的
return 0;
}
- 当无符号对象和有符号对象相加时,有符号对象会转换成无符号对象。这时有负数就十分危险
前缀 | 含义 | 类型 |
---|---|---|
u | unicode 16字符 | char16_t |
U | Unicode 32字符 | char32_t |
L | 宽字符 | wchar_t |
u8 | UTF(仅用于字符串字面常量) | char |
默认初始化:定义在所有函数外部的的变量被初始化为0.而在函数内部的内置类型变量将不被初始化。就是未定义的。
-
引用
- 引用就是为对象起了另外一个名字,当引用改变时,对象也改变
- 引用必须被初始化
- 引用类型的初始值,必须是一个对象且引用必须引用相同类型
int i = 1024;
int &r = i; //&是引用符
-
指针
- 指针本身便是一个对象,允许对指针赋值和拷贝
- 指针和其他内置类型一样,在快作用域内定义的指针如果没被初始化,也是一个不确定的值。所有在使用指针是,当不确定要指向何处是先将他变成空指针
- C++空指针方法
int *p1 = nullptr;
int *p2 = 0;
int *p2 = NULL; //需要包含#include cstdlib
指针和引用的主要区别
- 引用必须初始化,指针不需要
- 引用一旦初始化完毕便不能更改,指针不需要
- 指针是一个对象,而引用不是
- 使用sizeof看指针的大小是4,而引用是被引用对象的大小
- auto类型说明符:由编译器根据值推断类型。同一行auto必须是相同类型。
- decltype:从表达式推断定义的变量类型
练习2.1:类型int、long、long long和short的区别是什么?无符号类型和带符号类型的区别是什么?float和double的区别是声明。
int和long的区别是存储数字的范围。
无符号和带符号区别是能不能存储负数。
float和double能存小数点后多少位。double更长
练习2.3:读写结果
#include <iostream>
int main(void)
{
unsigned u = 10, u2 = 42;
std::cout << u2 - u << std::endl; //10
std::cout << u - u2 << std::endl; //一个取模后的结果
int i = 10, i2 = 42;
std::cout << i2 - i << std::endl; //32
std::cout << i - i2 << std::endl;//-32
std::cout << i - u << std::endl; //0
std::cout << u - i << std::endl;//0
}
练习2.15:下面哪个定义是不合法的?为什么?
int ival = 1.01; //合法,小数点后面会被截断,但是不要这么定义
int &rval1 = 1.01; //不合法,引用必须是一个对象
int &r = ival; //合法
int &rval3; //不合法引用必须初始化