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; // 程序结束
}

image-20251129233737468

1.1 整型溢出

这里介绍一下在使用整型变量时很常见的错误:溢出。

可以看到短整型变量num1根据定义来说它的取值范围应该是(-32768~32767),而我们给它赋值32768,超过了它的取值范围,这时候就会触发溢出机制变成了-32768。它背后的机制可以如下图所示(图来自C++ Primer Plus):

image-20251130082414783

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的缩写。

而有的时候可以省略部分修饰关键字,或调整修饰关键字的顺序。这意味着同一类型会存在多种等价表述。例如 intsignedint signedsigned int 表示同一类型,而 unsigned longunsigned 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;
}

image-20251130091334501

这里用到了强制转换语句(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、 实型(浮点型)

作用:用于表示小数

浮点型变量分为两种:

  1. 单精度float
  2. 双精度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;
}

image-20251130095227102

posted @ 2025-11-30 11:02  慕深雨  阅读(0)  评论(0)    收藏  举报