目录
常见的数字类型
有符号与无符号
类型范围
附默认值
类型转换
赋值关系描述
字面值与进制描述
转义字符
操作符
运算符优先级
常见的数字类型
| 类型 | 描述 | 示例 |
| void | void常用表示方法没有返回值 | |
| bool | 表示是与非,条件符合/条件不符合。 | bool b {true}; |
| char | 单个字符 | char ch {'c'}; |
| wchar_t | 宽字符(大小取决于编译器) | wchar_t w {L'm'}; |
| char8_t | 8位Unicode编码的字符。 c++20以上支持 | char8_t c8 {u8'm'}; |
| char16_t | 16位Unicode编码的字符。 | char16_t c16 {u'm'}; |
| char32_t | 32位Unicode编码的字符。 | char32_t c32 {U'm'}; |
| std::byte | 单字节 | std::byte b {8}; |
| short | 短整型(一般2字节) | short s {10}; |
| unsigned short | 无符号短整型(一般2字节) 表示非负数 | unsigned short s {12U}; |
| int | 整型(一般4字节) | int i {-7}; |
| unsigned int | 无符号整型(一般4字节) 表示非负数 | unsigned int i {10U}; |
| long | 长整型(一般4字节) | long i {123L}; |
| unsigned long | 无符号长整型(一般4字节) 表示非负数 | unsigned long i {123UL}; |
| long long | 超长整型(一般8字节) | long long i {123LL}; |
| unsigned long long | 无符号超长整型(一般8字节) 表示非负数 | unsigned long long i {140ULL}; |
| float | 单精度浮点型,最低6位小数 | float f {7.2F}; |
| double | 双精度浮点型,最低10位小数 | double d {3.14}; |
| long double | 长双精度浮点型,最低10位精度 | long double d {16.98L}; |
有符号与无符号
除bool, wchar_t, char16_t. char32_t外,上述类型均有无符号类型。
有符号:存在正负值,数字范围较小,如8bits的数字范围为-127~127,大多数机器支持-128~127
无符号:全是正数或0,所有的位都用来表示数值,例如8bits的数字范围为0~255
int, short, long, and long long均是有符号的,其对应的无符号表示为:
| signed | unsigned |
| int | unsigned int |
| short | unsigned short |
| long | unsigned long |
| long long | unsigned long long |
对于char, 其实存在两种类型,包括signed char和unsigned char, 至于哪种是等价于char的,取决于编译器。
类型范围
JAVA中有Integer.MAX_VALUE的查询,类似的c++存在numeric_limits:
cout << "int:n";
cout << format("Max int value: {}n", numeric_limits::max());
cout << format("Min int value: {}n", numeric_limits::min());
cout << format("Lowest int value: {}n", numeric_limits::lowest());
cout << "ndouble:n";
cout << format("Max double value: {}n", numeric_limits::max());
cout << format("Min double value: {}n", numeric_limits::min());
cout << format("Lowest double value: {}n", numeric_limits::lowest());
max(), min(), lowest()分别查询到当前类型的最大值,最小值,最低值。
int:
Max int value: 2147483647
Min int value: -2147483648
Lowest int value: -2147483648
double:
Max double value: 1.79769e+308
Min double value: 2.22507e-308
Lowest double value: -1.79769e+308
那么后两者的区别是什么呢?
对于整型数据,两者是相等的。对于浮点数,Min获取到的是最小的正数,lowest获取的是所能表示的最小的那个值,即-max()
同时,numeric_limits可以用来获取“无穷”:
numeric_limits::infinity
表示无穷的一个变量,常用于表示一个非零值除以0的结果。
NaN用来表示不是一个数,常用于表示0除以0的结果。
二者均可以通过以下方法进行判断:
std::isnan() std::isinf()
附默认值
int i {}; // 0
float f {}; // 0.0
整型默认0,浮点型默认0.0,指针默认nullptr, 类默认为默认构造器创建的对象
类型转换
c++存在三种显示转换方式:
float myFloat { 3.14f };
int i1 { (int)myFloat }; // method 1
int i2 { int(myFloat) }; // method 2
int i3 { static_cast(myFloat) }; // method 3
其中方式一是沿用的c的风格,比较常用。方法二很少使用。方法三是比较推荐的方式。
还有具有兼容性的隐式转换:
long l {someshort};
当新的类型完全可以覆盖老类型时,没有问题。否则需要注意精度损失的问题。
赋值关系描述
// bool赋数值时,0赋值为false, 其他赋值为true
bool b = 42; // b is true
// true转为数值为1, false转为数值为0
int i = b; // i has value 1
// 浮点数赋值给整型的时候,保留整数部分
i = 3.14; // i has value 3
// 整型赋值给浮点型,小数部分为0,可能会存在精度损失
double pi = i; // pi has value 3.0
// 有符号赋值给无符号时,会自动mod 范围,如8位就会mod256
unsigned char c = -1; // assuming 8-bit chars, c has value 255
// 有符号赋值给一个超出范围的数值时,会得到undefined,可能造成程序崩溃
signed char c2 = 256; // assuming 8-bit chars, the value of c2 is undefined
// bool赋数值时,0赋值为false, 其他赋值为true
bool b = 42; // b is true
// true转为数值为1, false转为数值为0
int i = b; // i has value 1
// 浮点数赋值给整型的时候,保留整数部分
i = 3.14; // i has value 3
// 整型赋值给浮点型,小数部分为0,可能会存在精度损失
double pi = i; // pi has value 3.0
// 有符号赋值给无符号时,会自动mod 范围,如8位就会mod256
unsigned char c = -1; // assuming 8-bit chars, c has value 255
// 有符号赋值给一个超出范围的数值时,会得到undefined,可能造成程序崩溃
signed char c2 = 256; // assuming 8-bit chars, the value of c2 is undefined
字面值与进制描述
十进制:20 (D)
八进制:24(O)
十六进制:14(H)
二进制:10100(B)
在c++中,十进制原样表示,八进制以0开头,十六进制以0X开头, 二进制以0B开头
| 进制 | 数值 |
| 十进制 | 20 |
| 八进制 | 024 |
| 十六进制 | 0x14 |
| 二进制 | 0B10100 |
上述三种进制的数值均为字面量,即代码中明确指定的数值,而非计算获取到的数值均为字面量。
科学计数法也同样可以使用:3.14159E3表示为3141.59
浮点数字面值:
| 单精度浮点 | 3.14F |
| 双精度浮点数 | 3.14 |
字符、字符串字面量:
| 字符字面量 | 'A', 'B', 'C' |
| 字符串字面量 | "China", "Hello World" |
字符串字面量的末尾默认带有" "表示字符串的结束,所以字符串常量的实际长度往往是字符长度+1
转义字符
| 转义符 | 含义 |
| n | 换行 |
| t | 横向tab键效果 |
| a | 警告 |
| v | 竖向tab键效果 |
| b | 删除键 |
| " | 双引号 |
| \ | 反斜杠 |
| ? | 问号 |
| ' | 单引号 |
| r | 回车 |
| f | 翻页 |
还有一种OOO使用最多三个8进制表示单个字符,使用xHHH多个十六进制位表示单个字符。
操作符
| 操作符 | 含义 | 示例 |
| = | 赋值 | int i = 3; int j = i; |
| ! | 非运算 | bool b {!true}; bool b2 {!b}; |
| + | 加法 | int i {3 + 2}; int j {i + 5}; int k {i + j}; |
| - * / | 减法 乘法 除法 | int i {5 – 1}; int j {5 * 2}; int k {j / i}; |
| % | 模,取余 | int rem {5 % 2}; |
| ++ | 自增, ++在前,先做自增 ++在后,后做自增 | i++; ++i; |
| -- | 自减 --在前,先做自减 --在后,后做自减 | i--; --i; |
| += -= *= /= %= | 下方表达式的简写: i = i + j | i += j; i -= j; i *= j; i /= j; i %= j; |
| & &= | 位与运算 位与赋值运算 | i = j & k; j &= k; |
| | |= | 位或运算 位或赋值运算 | i = j | k; j |= k; |
| ^ ^= | 位异或运算 异或赋值运算 | i = i ^ j; i ^= j; |
| << >> <<= >>= | 移位运算 移位赋值运算 | i = i << 1; i = i >> 4; i <<= 1; i >>= 4; |
| ?: | 三维运算 | i > 2 ? "yes" : "no" |
运算符优先级
| 优先级降序 |
| ++ -- (postfix) |
| ! ++ -- (prefix) |
| * / % |
| + - |
| << >> |
| & |
| ^ |
| | |
| = += -= *= /= %= &= |= ^= <<= >>= |



