目录
1. 标准输入输出库
2. 定义变量
3. 关于基本数据类型
3.1 计算机如何存储数据
3.2 基本数据类型
3.2.1 数值类型
3.2.1.1 整数类型
3.2.1.2 浮点数类型
3.2.2 字符类型
3.2.2.1 ASCII表
4. 进制数之间的转换
4.1 十进制整数和二进制之间的相互转换
5. C语言运算的优先级
6. 关于C语言的除号(/)运算
7. 混合数据运算
(1) 输出示例
输出,使用函数printf():
#define _CRT_SECURE_NO_WARNINGS #include int main() { printf("hello world\n");//print functon,只打一个串,可省略格式 printf("%s\n", "yyy"); return 0; } |
#define _CRT_SECURE_NO_WARNINGS #include int main() { printf("hello world\n");//print functon printf("%s\n", "yyy"); printf("%d\n", 123); printf("%c\n", '1'); //单个字符的定义,用单引号括起来 printf("%f\n", 33.14159); //浮点数,就是带小数点的数 return 0; } |
(2)输入示例
输入:使用scanf()函数
#define _CRT_SECURE_NO_WARNINGS #include int main() { int a, b; printf("输入两个整数,输入时分别用空格隔开:\n"); scanf("%d %d", &a, &b); printf("你输入的两个整数是:%d, %d\n", a, b); return 0; } |
格式:
数据类型+标志符; //每个语句都以分号结束 |
(1) 标志符自由定义,但是有规则:C语言的标识符只能以字母(26,大小写) / 下划线(_)开头。
(2) 数据类型:如下图
(3) 可以在定义的时候赋值;也可以先定义后赋值(=是赋值运算符)。
(4) 同种数据类型的变量可以定义在同一行,用多个逗号隔开即可。
#define _CRT_SECURE_NO_WARNINGS #include int main() { int a; int b; int c, d, e; //同种数据类型的变量可以定义在同一行,用多个逗号隔开即可 int f = 8; //定义变量的时候,直接赋值 a = 9; //先定义后赋值 printf("a=%d, f=%d\n", a,f); return 0; } |
计算机的存储单位有:byte/kb/mb/gb/...
(1)计算机只能识别二进制的字节码语言,如11001001。因此存储在计算机当中的所有信息,无论是视频、图片、还是文字,最终都要转化为二进制字节码。
(2)每一位数字所占的大小为1bit(比特)。bit是计算机中最小的存储单位。
(3)常见的基本单位及转换关系
字节:byte K字节:也叫千字节 M字节:也叫兆字节 G字节:也叫吉字节 T字节: ........... |
转换关系:
1byte=8 bit, Byte是计算机中最基本的存储单位。
1Kb=1024 byte
1Mb=1024Kb
1Gb=1024Mb
.......................-----------------------------------------------------------------
注:它们之间是1024倍的关系
比如:
//2Mb转成kb:
2Mb=2*1024 kb =2048 kb
//2Mb转成字节:
2Mb=2*1024 *1024 = 2097152 byte
C语言中,可以用sizeof()函数来获取不同数据类型在内存中所占用的字节数,调用的形式:
sizeof(类型)
#define _CRT_SECURE_NO_WARNINGS #include int main() { //64位的操作系统 printf("整形, int: %d个字节\n", sizeof(int)); printf("短整形,short int: %d个字节\n", sizeof(short int)); printf("长整形,long int: %d个字节\n", sizeof(long int)); return 0; } |
(1)int类型
int 类型: 占4个字节,也就是4*8=32bit,定义一个变量后,计算机会给该变量开辟一块内存空间,图示如下:
比如:十进制的56(正数),用计算器算出它对应的二进制数是:
00000000 00000000 00000000 00111000
在计算机中它就是这样存储的:
对于有符号的类型来说,最高位,也就是第32个bit是用来表示符号的,表示这个数是正数还是负数(一个bit,有两种情况,0/1,0表示正数,1表示负数)。所以,能表示数的范围,就只剩下31个bit,整型数据能表示的数值范围计算如下:
负数:-2^31 ~ -1 0: 0 正数:1 ~ 2^31 |
合起来记:-2^31~ 2^31-1,只要记得它所占用的内存字节数,能表示的数的范围就可以计算出来了。
(2)short int类型
能表示的数值范围计算方法与int类型一样。
(3)long int类型
能表示的数值范围计算方法与int类型一样。
小结:
|
浮点型用来存储和计算小数如3.14、7.890
单精度类型,float,所占存储空间大小为4个字节,存储的数字范围:
-3.4x10^38~ 3.4x10^38
双精度类型, double,所占存储空间大小为8个字节,存储的数字范围:
-1.7x10^380~1.7x10^380
单精度和双精度的差别: 单精度数据类型能表示的数值范围要小过。
示例:
#define _CRT_SECURE_NO_WARNINGS #include int main() { //64位的操作系统 printf("整形, int: %d个字节\n", sizeof(int)); printf("短整形,short int: %d个字节\n", sizeof(short int)); printf("长整形,long int: %d个字节\n", sizeof(long int)); printf("单精度浮点类型,float: %d个字节\n", sizeof(float)); printf("双精度浮点类型,double: %d个字节\n", sizeof(double)); float num1 = 3.14159; float num2 = 45.897; printf("num1=%f, num2=%f\n", num1, num2); return 0; } |
字符类型占用一个字节,能表示的数值范围是:-2^7~2^7-1=-128~127
对于常用的字符,计算机统一进行了编码,共有127个。可以用字符类型的变量来存储它们。
Bin (二进制) |
Oct (八进制) |
Dec (十进制) |
Hex (十六进制) |
缩写/字符 |
解释 |
0000 0000 |
00 |
0 |
0x00 |
NUL(null) |
空字符 |
0000 0001 |
01 |
1 |
0x01 |
SOH(start of headline) |
标题开始 |
0000 0010 |
02 |
2 |
0x02 |
STX (start of text) |
正文开始 |
0000 0011 |
03 |
3 |
0x03 |
ETX (end of text) |
正文结束 |
0000 0100 |
04 |
4 |
0x04 |
EOT (end of transmission) |
传输结束 |
0000 0101 |
05 |
5 |
0x05 |
ENQ (enquiry) |
请求 |
0000 0110 |
06 |
6 |
0x06 |
ACK (acknowledge) |
收到通知 |
0000 0111 |
07 |
7 |
0x07 |
BEL (bell) |
响铃 |
0000 1000 |
010 |
8 |
0x08 |
BS (backspace) |
退格 |
0000 1001 |
011 |
9 |
0x09 |
HT (horizontal tab) |
水平制表符 |
0000 1010 |
012 |
10 |
0x0A |
LF (NL line feed, new line) |
换行键 |
0000 1011 |
013 |
11 |
0x0B |
VT (vertical tab) |
垂直制表符 |
0000 1100 |
014 |
12 |
0x0C |
FF (NP form feed, new page) |
换页键 |
0000 1101 |
015 |
13 |
0x0D |
CR (carriage return) |
回车键 |
0000 1110 |
016 |
14 |
0x0E |
SO (shift out) |
不用切换 |
0000 1111 |
017 |
15 |
0x0F |
SI (shift in) |
启用切换 |
0001 0000 |
020 |
16 |
0x10 |
DLE (data link escape) |
数据链路转义 |
0001 0001 |
021 |
17 |
0x11 |
DC1 (device control 1) |
设备控制1 |
0001 0010 |
022 |
18 |
0x12 |
DC2 (device control 2) |
设备控制2 |
0001 0011 |
023 |
19 |
0x13 |
DC3 (device control 3) |
设备控制3 |
0001 0100 |
024 |
20 |
0x14 |
DC4 (device control 4) |
设备控制4 |
0001 0101 |
025 |
21 |
0x15 |
NAK (negative acknowledge) |
拒绝接收 |
0001 0110 |
026 |
22 |
0x16 |
SYN (synchronous idle) |
同步空闲 |
0001 0111 |
027 |
23 |
0x17 |
ETB (end of trans. block) |
结束传输块 |
0001 1000 |
030 |
24 |
0x18 |
CAN (cancel) |
取消 |
0001 1001 |
031 |
25 |
0x19 |
EM (end of medium) |
媒介结束 |
0001 1010 |
032 |
26 |
0x1A |
SUB (substitute) |
代替 |
0001 1011 |
033 |
27 |
0x1B |
ESC (escape) |
换码(溢出) |
0001 1100 |
034 |
28 |
0x1C |
FS (file separator) |
文件分隔符 |
0001 1101 |
035 |
29 |
0x1D |
GS (group separator) |
分组符 |
0001 1110 |
036 |
30 |
0x1E |
RS (record separator) |
记录分隔符 |
0001 1111 |
037 |
31 |
0x1F |
US (unit separator) |
单元分隔符 |
0010 0000 |
040 |
32 |
0x20 |
(space) |
空格 |
0010 0001 |
041 |
33 |
0x21 |
! |
叹号 |
0010 0010 |
042 |
34 |
0x22 |
" |
双引号 |
0010 0011 |
043 |
35 |
0x23 |
# |
井号 |
0010 0100 |
044 |
36 |
0x24 |
$ |
美元符 |
0010 0101 |
045 |
37 |
0x25 |
% |
百分号 |
0010 0110 |
046 |
38 |
0x26 |
& |
和号 |
0010 0111 |
047 |
39 |
0x27 |
' |
闭单引号 |
0010 1000 |
050 |
40 |
0x28 |
( |
开括号 |
0010 1001 |
051 |
41 |
0x29 |
) |
闭括号 |
0010 1010 |
052 |
42 |
0x2A |
* |
星号 |
0010 1011 |
053 |
43 |
0x2B |
+ |
加号 |
0010 1100 |
054 |
44 |
0x2C |
, |
逗号 |
0010 1101 |
055 |
45 |
0x2D |
- |
减号/破折号 |
0010 1110 |
056 |
46 |
0x2E |
. |
句号 |
0010 1111 |
057 |
47 |
0x2F |
/ |
斜杠 |
0011 0000 |
060 |
48 |
0x30 |
0 |
字符0 |
0011 0001 |
061 |
49 |
0x31 |
1 |
字符1 |
0011 0010 |
062 |
50 |
0x32 |
2 |
字符2 |
0011 0011 |
063 |
51 |
0x33 |
3 |
字符3 |
0011 0100 |
064 |
52 |
0x34 |
4 |
字符4 |
0011 0101 |
065 |
53 |
0x35 |
5 |
字符5 |
0011 0110 |
066 |
54 |
0x36 |
6 |
字符6 |
0011 0111 |
067 |
55 |
0x37 |
7 |
字符7 |
0011 1000 |
070 |
56 |
0x38 |
8 |
字符8 |
0011 1001 |
071 |
57 |
0x39 |
9 |
字符9 |
0011 1010 |
072 |
58 |
0x3A |
: |
冒号 |
0011 1011 |
073 |
59 |
0x3B |
; |
分号 |
0011 1100 |
074 |
60 |
0x3C |
< |
小于 |
0011 1101 |
075 |
61 |
0x3D |
= |
等号 |
0011 1110 |
076 |
62 |
0x3E |
> |
大于 |
0011 1111 |
077 |
63 |
0x3F |
? |
问号 |
0100 0000 |
0100 |
64 |
0x40 |
@ |
电子邮件符号 |
0100 0001 |
0101 |
65 |
0x41 |
A |
大写字母A |
0100 0010 |
0102 |
66 |
0x42 |
B |
大写字母B |
0100 0011 |
0103 |
67 |
0x43 |
C |
大写字母C |
0100 0100 |
0104 |
68 |
0x44 |
D |
大写字母D |
0100 0101 |
0105 |
69 |
0x45 |
E |
大写字母E |
0100 0110 |
0106 |
70 |
0x46 |
F |
大写字母F |
0100 0111 |
0107 |
71 |
0x47 |
G |
大写字母G |
0100 1000 |
0110 |
72 |
0x48 |
H |
大写字母H |
0100 1001 |
0111 |
73 |
0x49 |
I |
大写字母I |
01001010 |
0112 |
74 |
0x4A |
J |
大写字母J |
0100 1011 |
0113 |
75 |
0x4B |
K |
大写字母K |
0100 1100 |
0114 |
76 |
0x4C |
L |
大写字母L |
0100 1101 |
0115 |
77 |
0x4D |
M |
大写字母M |
0100 1110 |
0116 |
78 |
0x4E |
N |
大写字母N |
0100 1111 |
0117 |
79 |
0x4F |
O |
大写字母O |
0101 0000 |
0120 |
80 |
0x50 |
P |
大写字母P |
0101 0001 |
0121 |
81 |
0x51 |
Q |
大写字母Q |
0101 0010 |
0122 |
82 |
0x52 |
R |
大写字母R |
0101 0011 |
0123 |
83 |
0x53 |
S |
大写字母S |
0101 0100 |
0124 |
84 |
0x54 |
T |
大写字母T |
0101 0101 |
0125 |
85 |
0x55 |
U |
大写字母U |
0101 0110 |
0126 |
86 |
0x56 |
V |
大写字母V |
0101 0111 |
0127 |
87 |
0x57 |
W |
大写字母W |
0101 1000 |
0130 |
88 |
0x58 |
X |
大写字母X |
0101 1001 |
0131 |
89 |
0x59 |
Y |
大写字母Y |
0101 1010 |
0132 |
90 |
0x5A |
Z |
大写字母Z |
0101 1011 |
0133 |
91 |
0x5B |
[ |
开方括号 |
0101 1100 |
0134 |
92 |
0x5C |
\ |
反斜杠 |
0101 1101 |
0135 |
93 |
0x5D |
] |
闭方括号 |
0101 1110 |
0136 |
94 |
0x5E |
^ |
脱字符 |
0101 1111 |
0137 |
95 |
0x5F |
_ |
下划线 |
0110 0000 |
0140 |
96 |
0x60 |
` |
开单引号 |
0110 0001 |
0141 |
97 |
0x61 |
a |
小写字母a |
0110 0010 |
0142 |
98 |
0x62 |
b |
小写字母b |
0110 0011 |
0143 |
99 |
0x63 |
c |
小写字母c |
0110 0100 |
0144 |
100 |
0x64 |
d |
小写字母d |
0110 0101 |
0145 |
101 |
0x65 |
e |
小写字母e |
0110 0110 |
0146 |
102 |
0x66 |
f |
小写字母f |
0110 0111 |
0147 |
103 |
0x67 |
g |
小写字母g |
0110 1000 |
0150 |
104 |
0x68 |
h |
小写字母h |
0110 1001 |
0151 |
105 |
0x69 |
i |
小写字母i |
0110 1010 |
0152 |
106 |
0x6A |
j |
小写字母j |
0110 1011 |
0153 |
107 |
0x6B |
k |
小写字母k |
0110 1100 |
0154 |
108 |
0x6C |
l |
小写字母l |
0110 1101 |
0155 |
109 |
0x6D |
m |
小写字母m |
0110 1110 |
0156 |
110 |
0x6E |
n |
小写字母n |
0110 1111 |
0157 |
111 |
0x6F |
o |
小写字母o |
0111 0000 |
0160 |
112 |
0x70 |
p |
小写字母p |
0111 0001 |
0161 |
113 |
0x71 |
q |
小写字母q |
0111 0010 |
0162 |
114 |
0x72 |
r |
小写字母r |
0111 0011 |
0163 |
115 |
0x73 |
s |
小写字母s |
0111 0100 |
0164 |
116 |
0x74 |
t |
小写字母t |
0111 0101 |
0165 |
117 |
0x75 |
u |
小写字母u |
0111 0110 |
0166 |
118 |
0x76 |
v |
小写字母v |
0111 0111 |
0167 |
119 |
0x77 |
w |
小写字母w |
0111 1000 |
0170 |
120 |
0x78 |
x |
小写字母x |
0111 1001 |
0171 |
121 |
0x79 |
y |
小写字母y |
0111 1010 |
0172 |
122 |
0x7A |
z |
小写字母z |
0111 1011 |
0173 |
123 |
0x7B |
{ |
开花括号 |
0111 1100 |
0174 |
124 |
0x7C |
| |
垂线 |
0111 1101 |
0175 |
125 |
0x7D |
} |
闭花括号 |
0111 1110 |
0176 |
126 |
0x7E |
~ |
波浪号 |
0111 1111 |
0177 |
127 |
0x7F |
DEL (delete) |
删除 |
示例:对于字符类型,输入输出都是%c
#define _CRT_SECURE_NO_WARNINGS #include int main() { //64位的操作系统 printf("字符型, char: 占用%d个字节\n", sizeof(char)); char ch_1 = 'a'; char ch_2 = 'A'; char ch_3 = '1'; printf("ch_1:%c, ch_2:%c, ch_3:%c\n", ch_1, ch_2, ch_3); return 0; } |
一般习惯上使用的都是十进制数,但是计算机实际上存储的是二进制数。
-----------------------------------------------------------------------------------------------------------
二进制数:Binary number
八进制数:Octal number
十进制数:Decimal number
十六进制数:Hexadecimal number
------------------------------------------------------------------------------------------------------------
十进制整数转二进制:反复除2取余数,直到做除法的结果为0。取余数逆向排序即可,需要注意的是数据占用的字节数,得到结果后,高位如果没有数据,则补零。
例1:将十进制的数15转换成二进制的数。
//int a= 15; 在内存中是这样存储的
00000000 00000000 00000000 0000 1111
例2:将二进制00000000 00000000 00000000 0000 1111,转为十进制。
步骤1:从最低位(bit0就是最低位,bit31就是最高位,即最右边是最低位)开始标号n,权值就是0或1,乘上2^n。
计算过程就是:1x2^0+1x2^1+1x2^2+1x2^3=15
优先级:同级运算,从左往右进行运算,不同级运算,按下表顺序,排在前面的优先级高。
运算优先级表
注:
(1)乘除取余,后加减【跟数学意义上的运算相似】
(2)计算关系后逻辑:计算优先关系,关系高于逻辑判断
示例:分离一个四位整数
#define _CRT_SECURE_NO_WARNINGS #include int main() { printf("输入4位整数\n");//print functon int int_num; //定义一个整型变量 scanf("%d", &int_num);//& + 变量:取这个变量的内存地址 //int qian_wei = (int_num/1000) %10; int qian_wei = (int_num / 1000); //int bai_bit = int_num/100%10; //第一种算法 int bai_bit = int_num % 1000 /100; //第二种算法 int shi_bit = int_num/10%10; int ge_bit = int_num%10; printf("%d, %d, 十位数%d, 个位数%d\n", qian_wei, bai_bit, shi_bit, ge_bit); return 0; } |
示例:两个值互换
#include int main() { int a = 1; int b = 2; int c; c = a; a = b; b = c; printf("a=%d,b=%d\n", a, b); } |
示例: 三个值互换
示例:输入任意两个整数,求解它们的和:
#define _CRT_SECURE_NO_WARNINGS #include int main() { int a, b, c; printf("输入两个整数\n"); scanf("%d%d", &a, &b); //scanf("%d",&a); //scanf("%d",&b); printf("a=%d, b=%d\n",a, b); c = a + b; printf("a+b=%d", c); } |
(1)参与计算的分子、分母如果都是整数,则计算结果也是整数【直接舍掉小数部分】。
#define _CRT_SECURE_NO_WARNINGS #include int main() { int a, b, c; a = 7; b = 2; c = a / b; printf("c:%d\n", c); return 0; } |
(2)小数赋值给一个整型数,小数部分直接被舍掉【截断】。
(3) 如果是整型和浮点型的混合,则存在数据类型转换,这种转换是计算机自动进行的转换,所以也称为“隐式转换”。低精度类型向高精度类型转换,即int转成浮点数再进行计算。
#define _CRT_SECURE_NO_WARNINGS #include int main() { int num_a, num_b, num_c; num_a = 7; float num_d = num_a / 2.0; //这里num_a先转为浮点数,也就是7.0,再做运算:7.0/2.0=3.5 printf("num_d: %f\n", num_d); return 0; } |
#define _CRT_SECURE_NO_WARNINGS #include int main() { int num_a, num_b, num_c; num_a = 7; float num_d = num_a / 2.0; //printf("num_d: %f\n", num_d); int num_e = num_a / 2.0; //3.5赋给一个整数,小数部分截断 printf("num_e: %d\n", num_e); return 0; } |
注:赋值运算要先算等号右边【注意运算规则】。
要注意隐式转换的规则,低精度向高精度转换(计算机的策略:运算过程中,确保数据精度不丢失)。
示例:
#include int main() { double d = 3.2; int x, y; x = 1.2; printf("x=%d\n", x);//x=1,截断 y = (x + 3.8) / 5.0; //(1.0+3.8)/5.0 = 0.96 , //0.96是浮点数,赋值给一个整数,则直接舍掉小数部分。 //y的结果就是0 printf("%d\n", d * y); //0 } |
运行结果:0
示例:
#include int main() { double d = 3.2; int x; float y; x = 1.2; y = (x + 3.8) / 5.0; printf("%f\n", d * y); } |
这个结果是多少?