C++自学之路3:算术类型
本文主要先简单介绍一下算术类型,这是最基础也是最容易入门的。
1、整型
作用:整型变量表示的是整数类型的数据
C++中能够表示整型的类型有以下几种方式,区别在于所占内存空间不同:
| 数据类型 | 占用空间 | 取值范围 |
|---|---|---|
| char(字符型) | 1字节 | -27到27-1(-128到127) |
| short(短整型) | 2字节 | (-2^15 ~ 2^15-1) (-32768~32767) |
| int(整型) | 4字节(21亿) | (-2^31 ~ 2^31-1) |
| long(长整形) | Windows为4字节,Linux为4字节(32位),8字节(64位) | (-2^31 ~ 2^31-1) |
| long long(长长整形) | 8字节 | (-2^63 ~ 2^63-1) |
char是一种特殊的整型,这里先不做说明,后面会说。
示例:
#include<iostream>
using namespace std;
int main()
{
//短整型
short num1 = 32768; //超出short范围,触发溢出机制,结果为-32768
//整型
int num2 = 32768; //正常显示
//长整型
long num3 = 10;
//长长整型
long long num4 = 10;
cout << "num1=" << num1 << endl;
cout << "num2=" << num2 << endl;
cout << "num3=" << num3 << endl;
cout << "num4=" << num4 << endl;
return 0; // 程序结束
}

1.1 整型溢出
这里介绍一下在使用整型变量时很常见的错误:溢出。
可以看到短整型变量num1根据定义来说它的取值范围应该是(-32768~32767),而我们给它赋值32768,超过了它的取值范围,这时候就会触发溢出机制变成了-32768。它背后的机制可以如下图所示(图来自C++ Primer Plus):
num1是有符号整数,当它从32767越界后,它的值就变成了另一端的取值-32768。像一根绳子围成了一个圆,超过了一端就会到另一端。同理,如果给num1赋值-32769,也会触发溢出机制并输出32767。
1.2 无符号类型数据
前面介绍的5种整型都有一种不能存储负数的无符号变体,其优点是可以增大变量能够存储的最大值。例如,如果short表示的范围为-32768到+32767,则无符号版本的表示范围为0-65535。当然,仅当存储的数值不会为负时才应使用无符号类型,如人口等。要创建无符号版本的基本整型,只需使用关键字unsigned来声明即可:
unsigned short change; // unsigned short type
unsigned int rovert; // unsigned int type
unsigned quarterback; // also unsigned int
unsigned loNG gone; // unsigned long type
unsigned long long lang_lang: // unsigned long long type
注意,unsigned本身是unsigned int 的缩写,就好像short是short int的缩写,long是long int的缩写。
而有的时候可以省略部分修饰关键字,或调整修饰关键字的顺序。这意味着同一类型会存在多种等价表述。例如 int,signed,int signed,signed int 表示同一类型,而 unsigned long 和 unsigned long int 表示同一类型。
在创建整型变量时,如果前面没有unsigned,那编译器就会默认为该变量是有符号数signed。
2、 char类型
char(字符型)数据是专门存储字符而设计的,用单引号''括起来。编程语言通过将字符编码成特定的数值使得计算机能够存储字符,因此,char类型实际上是另一种整型。而很多系统上支持的字符(字母,数字,标点符号等)都不超过128个,因此用一个字节就能表示所有的符号。
作用:字符型变量用于显示单个字符
语法:char ch = 'a';
注意1:在显示字符型变量时,用单引号将字符括起来,不要用双引号
注意2:单引号内只能有一个字符,超过一个就是字符串
- C和C++中字符型变量只占用1个字节。
- 字符型变量并不是把字符本身放到内存中存储,而是将对应的ASCII编码放入到存储单元。
示例:
#include<iostream>
using namespace std;
int main()
{
char ch = 'a';
cout <<"ch=" << ch << endl;
cout <<"ch所占内存大小为:" << sizeof(char) << endl;
//ch = "abcde"; //错误,不可以用双引号
//ch = 'abcde'; //错误,单引号内只能引用一个字符
cout <<"字符a对应的ASCII码为:" << (int)ch << endl; //查看字符a对应的ASCII码
ch = 65; //也可以直接用ASCII给字符型变量赋值
cout <<"赋值后的ch是:" << ch << endl;
system("pause");
return 0;
}

这里用到了强制转换语句(int)ch,简单来说就是:
//(你想转换的数据类型)另一个类型变量的变量名
ASCII码表格:
| ASCII值 | 控制字符 | ASCII值 | 字符 | ASCII值 | 字符 | ASCII值 | 字符 |
|---|---|---|---|---|---|---|---|
| 0 | NUT | 32 | (space) | 64 | @ | 96 | 、 |
| 1 | SOH | 33 | ! | 65 | A | 97 | a |
| 2 | STX | 34 | " | 66 | B | 98 | b |
| 3 | ETX | 35 | # | 67 | C | 99 | c |
| 4 | EOT | 36 | $ | 68 | D | 100 | d |
| 5 | ENQ | 37 | % | 69 | E | 101 | e |
| 6 | ACK | 38 | & | 70 | F | 102 | f |
| 7 | BEL | 39 | , | 71 | G | 103 | g |
| 8 | BS | 40 | ( | 72 | H | 104 | h |
| 9 | HT | 41 | ) | 73 | I | 105 | i |
| 10 | LF | 42 | * | 74 | J | 106 | j |
| 11 | VT | 43 | + | 75 | K | 107 | k |
| 12 | FF | 44 | , | 76 | L | 108 | l |
| 13 | CR | 45 | - | 77 | M | 109 | m |
| 14 | SO | 46 | . | 78 | N | 110 | n |
| 15 | SI | 47 | / | 79 | O | 111 | o |
| 16 | DLE | 48 | 0 | 80 | P | 112 | p |
| 17 | DCI | 49 | 1 | 81 | Q | 113 | q |
| 18 | DC2 | 50 | 2 | 82 | R | 114 | r |
| 19 | DC3 | 51 | 3 | 83 | S | 115 | s |
| 20 | DC4 | 52 | 4 | 84 | T | 116 | t |
| 21 | NAK | 53 | 5 | 85 | U | 117 | u |
| 22 | SYN | 54 | 6 | 86 | V | 118 | v |
| 23 | TB | 55 | 7 | 87 | W | 119 | w |
| 24 | CAN | 56 | 8 | 88 | X | 120 | x |
| 25 | EM | 57 | 9 | 89 | Y | 121 | y |
| 26 | SUB | 58 | : | 90 | Z | 122 | z |
| 27 | ESC | 59 | ; | 91 | [ | 123 | { |
| 28 | FS | 60 | < | 92 | / | 124 | | |
| 29 | GS | 61 | = | 93 | ] | 125 | } |
| 30 | RS | 62 | > | 94 | ^ | 126 | ` |
| 31 | US | 63 | ? | 95 | _ | 127 | DEL |
ASCII 码大致由以下两部分组成:
- ASCII 非打印控制字符: ASCII 表上的数字 0-31 分配给了控制字符,用于控制像打印机等一些外围设备。
- ASCII 打印字符:数字 32-126 分配给了能在键盘上找到的字符,当查看或打印文档时就会出现。
2.1 转义字符
作用:用于表示一些不能直接用键盘输入的ASCII字符
现阶段我们常用的转义字符有: \n \\ \t
| 转义字符 | 含义 | ASCII码值(十进制) |
|---|---|---|
| \a | 警报 | 007 |
| \b | 退格(BS) ,将当前位置移到前一列 | 008 |
| \f | 换页(FF),将当前位置移到下页开头 | 012 |
| \n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
| \r | 回车(CR) ,将当前位置移到本行开头 | 013 |
| \t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
| \v | 垂直制表(VT) | 011 |
| \\ | 代表一个反斜线字符"\" | 092 |
| ' | 代表一个单引号(撇号)字符 | 039 |
| " | 代表一个双引号字符 | 034 |
| ? | 代表一个问号 | 063 |
| \0 | 数字0 | 000 |
| \ddd | 8进制转义字符,d范围0~7 | 3位8进制 |
| \xhh | 16进制转义字符,h范围0-9,a-f,A~F | 3位16进制 |
示例:
int main()
{
cout << "\\" << endl;
cout << "\tHello" << endl;
cout << "\n" << endl;
system("pause");
return 0;
}
2.2 字符串型
作用:用于表示一串字符
#include<iostream>
#include<string>//用C++风格的字符串需要包含这个头文件
using namespace std;
int main()
{
char str[] = "Hello, C World!"; // C风格字符串。要在变量名后加一个[]
cout << "C风格字符串: " << str << endl;
string str2 = "Hello, C++ World!"; // C++风格字符串
cout << "C++风格字符串: " << str2 << endl;
system("pause"); // 暂停程序,等待用户输入
}
注意:C++风格字符串,需要加入头文件#include<string>
3 、布尔类型 bool
作用:布尔数据类型代表真或假的值
bool类型只有两个值:
- true --- 真
- false --- 假
bool类型占1个字节大小
当给布尔类型变量赋值时,非零值被视为true,零值被视为false。
示例:
#include<iostream>
using namespace std;
int main()
{
bool flag = true; // 定义布尔类型变量flag为真
cout << "flag的值为: " << flag << endl; // 输出flag的值,结果为1
flag = false; // 修改布尔变量的值为假
cout << "flag的值为: " << flag << endl; // 输出修改后的布尔值
cout << "布尔类型的大小: " << sizeof(flag) << " 字节" << endl; // 输出布尔类型的大小
return 0;
}
在C++中,bool类型变量在输出时默认显示为1(true)或0(false)而不是字符串"true"或"false"。
4、 实型(浮点型)
作用:用于表示小数
浮点型变量分为两种:
- 单精度float
- 双精度double
两者的区别在于表示的有效数字范围不同。
| 数据类型 | 占用空间 | 有效数字范围 |
|---|---|---|
| float | 4字节 | 6~9位有效数字 |
| double | 8字节 | 15~17位有效数字 |
示例:
int main()
{
float f1 = 3.14f;
double d1 = 3.14;
cout << f1 << endl;
cout << d1<< endl;
cout << "float sizeof = " << sizeof(f1) << endl;
cout << "double sizeof = " << sizeof(d1) << endl;
//科学计数法
float f2 = 3e2; // 3 * 10 ^ 2
cout << "f2 = " << f2 << endl;
float f3 = 3e-2; // 3 * 0.1 ^ 2
cout << "f3 = " << f3 << endl;
system("pause");
return 0;
}
如果想要实现像C那样的控制输出格式,需要头文件iomanip
4.1 C++ 标准库 iomanip
iomanip 库中的函数允许开发者控制输出格式,如设置小数点后的位数、设置宽度、对齐方式等。
iomanip 是 Input/Output Manipulators 的缩写,它提供了一组操作符,用于控制 C++ 标准库中的输入/输出流的格式,适用以下场景:
- 科学计算中浮点数格式的处理;
- 数据对齐与美化;
- 显示特定进制或格式的数值。
语法:https://www.runoob.com/cplusplus/cpp-libs-iomanip.html
举例:设置精度
//使用 setprecision 可以设置设置浮点数的有效位数。
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double pi = 3.141592653589793;
cout << "Default: " << pi << "\n";
cout << "Set precision (3): " << setprecision(3) << pi << "\n";//3位有效数字
cout << "Set precision (7): " << setprecision(7) << pi << "\n";//7位有效数字
return 0;
}
输出结果:
Default: 3.14159
Set precision (3): 3.14
Set precision (7): 3.141593
举例:固定小数点和科学计数法
//fixed 和 scientific 可以控制浮点数的输出格式。
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double num = 123456789.0;
cout << "Fixed: " << fixed << num << endl;
cout << "Scientific: " << scientific << num << endl;
return 0;
}
Fixed: 123456789.000000
Scientific: 1.23456789e+08
fixed 格式控制符强制浮点数以固定的小数位数显示,默认显示6位小数,不足的用0补齐。这就是为什么 123456789.0 会显示为 123456789.000000。
上面两个例子结合起来可以改变输出时的小数位数:
//fixed和setprecision结合起来可以设置小数位数
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double num = 3.14159;
cout << "两位小数输出: " << fixed << setprecision(2) << num << endl;
cout << "0位小数输出: " << fixed << setprecision(0) << num << endl;
cout << "9位小数输出: " << fixed << setprecision(9) << num << endl;
double num1 = 314159;
cout << "两位小数输出科学计数法: " << scientific << setprecision(2) << num1 << endl;
cout << "0位小数输出科学计数法: " << scientific << setprecision(0) << num1 << endl;
cout << "9位小数输出科学计数法: " << scientific << setprecision(9) << num1 << endl;
return 0;
}


浙公网安备 33010602011771号