整型
- 概念:表达整数类型的数据
- 语法:
int a = 123; // 定义了一个专门用来存储整数的变量a
1.i+1+_
2.
- 需要注意的地方:
- int 的本意是 integer,即整数的意思
- int a 代表在内存中开辟一块小区域,称为 a,用来存放整数,a 一般被称为变量。
- 变量 a 所占内存大小,在不同的系统中是不一样的,64位系统典型的大小是4个字节
- 变量 a 有固定的大小,因此也有取值范围,典型的范围是:-2147483648到2147483647
- 整型修饰符
- short:用来缩短整型变量的尺寸,减少取值范围并节省内存,称为短整型
- long:用来增长整型变量的尺寸,增大取值范围并占用更多内存,称为长整型
- long long:用来增长整型变量的尺寸,增大取值范围并占用更多内存,称为长长整型
- unsigned:用来去除整型变量的符号位,使得整型变量只能表达非负整数
short int a; // 短整型
long int b; // 长整型
long long int c; // 长长整型
unsigned int e; // 无符号整型
unsigned short int f; // 无符号短整型
unsigned long int g; // 无符号长整型
unsigned long long int h; // 无符号长长整型
- 使用整型修饰符后,关键字 int 可以被省略,比如:
short a; // 短整型
long b; // 长整型
long long c; // 长长整型
unsigned e; // 无符号整型
unsigned short f; // 无符号短整型
unsigned long g; // 无符号长整型
unsigned long long h; // 无符号长长整型
- 符号位:
- 有符号的整型数据,首位为符号位,0表示正数,1表示负数。
- 无符号的整形数据,没有符号位。
- 编码形式:
- 原码:正数直接使用二进制来表达,比如a=100,在内存中是 00...001100100
- 补码:负数用绝对值取反加一来表达,比如a=-3,在内存中是11...1111111101
- 注意负数的补码在取反加一的时候,符号位是不动的
- 溢出:
- 超过数据所能表达的范围,称为溢出,就像汽车里程表,最大值和最小值是相邻的
- 进制:源码中可以使用八进制、十进制或十六进制,但实际数据在内存中一律是二进制
- 十进制(默认),比如1099
- 八进制,比如013
- 十六进制,比如0x6FF0A
- 格式控制符
- int 整型:%d
- short 整型:%hd, h代表half,即一半
- long 整型:%ld
- long long 整型:%lld
- 显示不同进制的前缀: %#o、 %#x
浮点型
- 概念:用来表达实数的数据类型
- 分类:
- 单精度浮点型(float),典型尺寸是4字节
- 双精度浮点型(double),典型尺寸是8字节
- 长双精度浮点型(long double),典型尺寸是16字节
- 占用内存越多,能表达的精度越高
float f1; // 单精度
double f2; // 双精度
long double f3; // 长双精度
浮点类型 |
最小精度 |
最大数值 |
float |
10的-37次方 |
10的38次方 |
double |
10的-307次方 |
10的308次方 |
long double |
10的-4931次方 |
10的4932次方 |
各种浮点型精度范围
字符
- 字符
char ch1 = 'a'; // 'a'是字符常量,代表字母a
char ch2 = '\n'; // '\n'是不可见字符常量,代表回车
- 计算机中存储的都是1和0,因此各种字符都必须被映射为某个数字才能存储到计算机中,这种映射关系形成的表称为 ASCII 码表。
数 值 |
字符 |
数 值 |
字符 |
数 值 |
字符 | |||
十进制 |
十六进制 |
十进制 |
十六进制 |
十进制 |
十六进制 | |||
00 |
0x00 |
‘\0’ |
20 |
0x14 |
DC4 |
40 |
0x28 |
( |
01 |
0x01 |
SOH |
21 |
0x15 |
NAK |
41 |
0x29 |
) |
02 |
0x02 |
STX |
22 |
0x16 |
SYN |
42 |
0x2A |
* |
03 |
0x03 |
ETX |
23 |
0x17 |
ETB |
43 |
0x2B |
+ |
04 |
0x04 |
EOT |
24 |
0x18 |
CAN |
44 |
0x2C |
, |
05 |
0x05 |
ENQ |
25 |
0x19 |
EM |
45 |
0x2D |
- |
06 |
0x06 |
ACK |
26 |
0x1A |
SUB |
46 |
0x2E |
. |
07 |
0x07 |
'\a' |
27 |
0x1B |
ESC |
47 |
0x2F |
/ |
08 |
0x08 |
'\b' |
28 |
0x1C |
FS |
48 |
0x30 |
0 |
09 |
0x09 |
'\t' |
29 |
0x1D |
GS |
49 |
0x31 |
1 |
10 |
0x0A |
‘\n’ |
30 |
0x1E |
RS |
50 |
0x32 |
2 |
11 |
0x0B |
‘\v’ |
31 |
0x1F |
US |
51 |
0x33 |
3 |
12 |
0x0C |
'\f' |
32 |
0x20 |
SPACE |
52 |
0x34 |
4 |
13 |
0x0D |
'\r' |
33 |
0x21 |
! |
53 |
0x35 |
5 |
14 |
0x0E |
SO |
34 |
0x22 |
EOT |
54 |
0x36 |
6 |
15 |
0x0F |
SI |
35 |
0x23 |
# |
55 |
0x37 |
7 |
16 |
0x10 |
DLE |
36 |
0x24 |
$ |
56 |
0x38 |
8 |
17 |
0x11 |
DC1 |
37 |
0x25 |
% |
57 |
0x39 |
9 |
18 |
0x12 |
DC2 |
38 |
0x26 |
& |
58 |
0x3A |
: |
19 |
0x13 |
DC3 |
39 |
0x27 |
' |
59 |
0x3B |
; |
ASCII码表 I
数 值 |
字符 |
数 值 |
字符 |
数 值 |
字符 | |||
十进制 |
十六进制 |
十进制 |
十六进制 |
十进制 |
十六进制 | |||
60 |
0x3C |
83 |
0x53 |
S |
106 |
0x6A |
j | |
61 |
0x3D |
= |
84 |
0x54 |
T |
107 |
0x6B |
k |
62 |
0x3E |
> |
85 |
0x55 |
U |
108 |
0x6C |
l |
63 |
0x3F |
? |
86 |
0x56 |
V |
109 |
0x6D |
m |
64 |
0x40 |
@ |
87 |
0x57 |
W |
110 |
0x6E |
n |
65 |
0x41 |
A |
88 |
0x58 |
X |
111 |
0x6F |
o |
66 |
0x42 |
B |
89 |
0x59 |
Y |
112 |
0x70 |
p |
67 |
0x43 |
C |
90 |
0x5A |
Z |
113 |
0x71 |
q |
68 |
0x44 |
D |
91 |
0x5B |
[ |
114 |
0x72 |
r |
69 |
0x45 |
E |
92 |
0x5C |
\ |
115 |
0x73 |
s |
70 |
0x46 |
F |
93 |
0x5D |
] |
116 |
0x74 |
y |
71 |
0x47 |
G |
94 |
0x5E |
^ |
117 |
0x75 |
u |
72 |
0x48 |
H |
95 |
0x5F |
_ |
118 |
0x76 |
v |
73 |
0x49 |
I |
96 |
0x60 |
` |
119 |
0x77 |
w |
74 |
0x4A |
J |
97 |
0x61 |
a |
120 |
0x79 |
x |
75 |
0x4B |
K |
98 |
0x62 |
b |
121 |
0x70 |
y |
76 |
0x4C |
L |
99 |
0x63 |
c |
122 |
0x7A |
z |
77 |
0x4D |
M |
100 |
0x64 |
d |
123 |
0x7B |
{ |
78 |
0x4E |
N |
101 |
0x65 |
e |
124 |
0x7C |
| |
79 |
0x4F |
O |
102 |
0x66 |
f |
125 |
0x7D |
} |
80 |
0x50 |
P |
103 |
0x67 |
g |
126 |
0x7E |
~ |
81 |
0x51 |
Q |
104 |
0x68 |
h |
127 |
0x7F |
DEL |
82 |
0x52 |
R |
105 |
0x69 |
i |
ASCII码表 II
字符本质上就是一个单字节的整型,支持整型所有的运算。比如:
char c1 = 20;
char c2 = c1 + 'a'; // 等价于 char c2 = 20 + 97;
printf("%c\n", c2); // 以字符形式输出117,即 'u'
printf("%d\n", c2); // 以整型形式输出117
字符串
- 定义
// 字符串的定义方式有两种:指针和数组
char *s1 = "abcd"; // 使用字符指针来表示字符串
char s2[]= "abcd"; // 使用字符数组来表示字符串
// 注意,使用数组来定义字符串时,方括号[]里面的数字可以省略
// 不省略也可以,但必须必字符串实际占用的内存字节数要大,比如:
char s3[] = "apple";
- 在内存中的存储
- 在内存中实际上是多个连续字符的组合
- 任何字符串都以一个 '\0' 作为结束标记,例如:"funny story" 的内存如下
数组类型
int
布尔型数据
- 概念:布尔型数据只有真、假两种取值,非零为真,零为假。
- 语法:
bool a = 1; // 逻辑真,此处1可以取其他任何非零数值
bool b = 0; // 逻辑假
- 注意:
- 逻辑真除了 1 之外,其他任何非零数值都表示逻辑真,等价于 1。
- 使用布尔型 bool 定义变量时需要包含系统头文件 stdbool.h。
- 布尔型数据常用语逻辑判断、循环控制等场合。
常量与变量
- 概念:不可改变的内存称为常量,可以改变的内存称为变量
- 举例:
int a = 100; // a是变量,而100是常量
float f = 3.14; // f是变量,而3.14是常量
char s[] = "abcd"; // s是变量,"abcd"是常量
- 常量的类型
- 100:整型 int
- 100L:长整型 long
- 100LL:长长整型 long long
- 100ULL:无符号长长整型 unsigned long long
- 3.14:双精度浮点型 double
- 3.14L:长双精度浮点型 long double
- 'a':字符型 char
- "abcd":字符指针 char *
标准输入
- 概念:键盘是系统的标准输入设备,从键盘中输入数据被称为标准输入
- 相关函数:
scanf(); // 格式化输入函数
fgets(); // 字符串输入函数
int a;
float f;
scanf("%d", &a); // 从键盘输入一个整型,放入指定的内存地址 &a 中
scanf("%f", &f); // 从键盘输入一个浮点数,放入指定的内存地址 &f 中
scanf("%d%f", &a, &f); // 从键盘依次输入一个整型和一个浮点型数据,用空白符隔开
char c;
char s[10];
scanf("%c", &c); // 从键盘输入一个字符,放入指定的内存地址 &f 中
scanf("%s", s ); // 从键盘输入一个单词,放入指定的数组 s 中(注意不是&s)
fgets(s, 10, stdin); // 从键盘输入一行字符串,放入数组 s 中
- 注意1:
- scanf() 与 printf() 不同,scanf() 的格式控制串不可乱写,尤其是结尾处的 \n
- 用户必须完全按照 scanf() 中描述的输入格式控制串来输入数据,否则将出错。
- 示例:
// 此处输入时必须带逗号
scanf("%d,%d", &a, &b);
// 此处必须先输入a=,然后才能输入整数
scanf("a=%d", &a);
// 此处结束输入时按下的回车符将被scanf()误以为格式控制符,无法正常结束输入
scanf("%d\n", &a);
- 注意2:
- scanf() 的返回值,代表成功从键盘读取的数据的个数
- 无法匹配 scanf() 指定格式的数据,将被遗留在输入缓冲区中,不会消失
- 示例:
// scanf() 试图从键盘读取两个整数
// 返回值 n 代表成功读取的个数,比如:
// 输入100 200,则 n 将等于2
// 输入100 abc,则 n 将等于1
// 输入abc xyz,则 n 将等于0;输入abc 200,n也将等于0
int n = scanf("%d%d", &a, &b);
// 根据 scanf() 的返回值,判断用户是否输入了正确的格式
while(n != 2)
{
// 需要清空缓冲区并提示用户重新输入
char s[50];
fgets(s, 50, stdin);
printf("请重新输入两个整数\n");
n = scanf("%d%d", &a, &b);
}