1、计算机的基本结构
2、什么是程序
3、程序的设计步骤
4、计算机的数据表示(进制转换)
5、基本数据类型
6、常量
1、计算机的基本结构
组成:
输入输出设备(键盘、鼠标)
CPU处理器(控制器、运算器、寄存器)
存储器
程序
存储器:
内存:工作存储器,容量较小,读写速度快,掉电会丢失数据
外存:长期保存数据,容量较大,读写速度慢,掉电不会丢失数据
寄存器:CPU内部的存储器,容量较小,读写速度最快
2、什么是程序
程序:计算机能够识别的一组有序的指令(数据结构+算法)
指令:计算机能够识别的操作
hello.c和a.out哪个是程序?a.out
3、程序的设计步骤
编辑(vim)代码-->编译(gcc)程序-->执行程序/调试程序(./a.out)
4、计算机的数据表示
分为:数值数据和非数值数据
4.1 非数值数据
非数值数据(不能够直接进行算术运算的数据):字符、图片、视频、声音
'a' 'b'
ASCII码(十进制):规定了每一个字符在计算机中对应的是哪八位的二进制数(1byte = 8bit)
4.2 数值数据
数值数据(能够直接进行算术运算的数据)
二进制、八进制、十进制、十六进制
二进制:0、1
八进制:0 ~ 7
十进制:0 ~ 9
十六进制:0 ~ 9,a(A) ~ f(F)//前后大小写保持一致
为了区分不同的进制,八进制签名加0,十六进制签名加0x
23(十进制) 023(八进制) 0x23(十六进制)
4.3 进制转换
二进制转成十进制:1001 --->1*2^3 + 0*2^2 + 0*2^1 + 1*2^0
八进制转成十进制:066 --->6*8^1 + 6*8^0
十六进制转成十进制:0xacdf -->10*16^3 + 12*16^2 + 13*16^1 + 15*16^0
十进制转成二进制:除2倒取余
十进制转成八进制:除8倒取余
十进制转成十六进制:除16倒取余
二进制八进制:
000 ---- 0
001 ---- 1
010 ---- 2
011 ---- 3
100 ---- 4
101 ---- 5
110 ---- 6
111 ---- 7
二进制与十六进制
0000 ---- 0
0001 ---- 1
0010 ---- 2
0011 ---- 3
0100 ---- 4
0101 ---- 5
0110 ---- 6
0111 ---- 7
1000 ---- 8
1001 ---- 9
1010 ---- a(小写的a和大写的A都可以)
1011 ---- b
1100 ---- c
1101 ---- d
1110 ---- e
1111 ---- f
0x8fea ---> 1000 1111 1110 1010
8421
1110->8 0100->4 0010->2 0001->1
练习
1、实现其它进制转成10进制
1011 0110= 1*2^7 + 1*2^5 + 1*2^4 + 1*2^2 + 1*2^1 = 128 + 32 + 16 + 4 + 2 = 182
0345 = 3*8^2 + 4*8^1 + 5*8^0 = 192 + 32 + 5 = 229
0xaf23 = 10*16^3 + 15*16^2 + 2*16^1 + 3*16^0 = 40960 + 3840 + 32 + 3 = 44835
2、将10进制转成二进制:987 = 0011 1101 1011
3、将8进制转成二进制:0734 = 111 011 100
4、将16进制转成二进制:0xffa76 = 1111 1111 1010 0111 0110
5、将二进制分别转成8进制和16进制
101 011 010 001 = 05321 = 0xad1
5、基本数据类型
5.1 关键字
关键字:系统预定义的,有特定含义,全部都是小写,不允许用户重新定义,一共有32个
C语言是强数据类型语言,对数据类型区分
数据类型:char、double、float、int、long、short、struct、union、void、enum
控制语句:break、case、continue、default、do、else、for、goto、if、switch、while
存储类型:auto、static、extern、register
const:只读
return:返回函数
signed:有符号数
sizeof:计算空间的大小(单位:字节)
typedef:给数据类型起别名
unsigned:无符号数
volatile:防止编译器优化
5.2 标识符
标识符:程序员自己定义的,一般用来定义变量名、函数名、类型名
命名规则:
(1)有数字、字母、下划线组成
(2)第一个字符不能为数字
(3)不能和关键字重名
(4)见名知意
5.3 转义字符
5.4 数据类型
输出
printf("格式控制串",输出表);
格式控制串:原样输出的内容 + 格式化符(%d,%c);
输出表:要输出的对象
例如:输出一个变量int a = 5的值
printf("a = %d",a);
%ld用来输出长整型数。
%d用来输出整型数。
%ld 的话 输出的字节要长点, %d 的要短点。比如,一个数大于32767 用%d 就要溢出。假如你想输出32768.用%d 就会输出-1.这就是溢出。但是用%ld 就不会。它能接受的数的范围大些!
5.4.1 32OS
字符型:char(1byte)
整型:int(4byte)、long(4byte)、short(2byte)
浮点型:float(4byte)、double(8byte)
5.4.2 64OS
字符型:char(1byte)
整型:int(4byte)、short(2byte)、long(8byte)
浮点型:float(4byte)、double(8byte)
注意:每一种数据类型所占大小不一样,数据类型只要是让我们合理分配内存空间(32和64位,唯一值差异为long数据类型)
5.5 有符号数和无符号数
signed:数值有正负之分,以补码的形式存储
作用:声明有符号类型的整数类型
一、为什么需要补码
计算机的 CPU 是无法做减法操作的,只能做加法,其实 CPU 中有一个逻辑单元叫加法器,计算机所做的减法,乘法,除法,都是由科学家将其变化为加法。
其实 2-5,实际所使用的方法是 2+(-5)进行的,而计算机只能存储 0 和 1,所以借用补码实现减法操作。
最高位是符号位,正数的符号位是0,负数的符号位为1
注意:符号位不参与运算
正数:原码、反码、补码都是一样的
比如:10 --->0000 1010
负数:-10
原码:1000 1010
反码:1111 0101
补码:1111 0110
1000 1001
1000 1010
负数:
原码-->补码:取反加1
补码-->原码:(1)减一取反 (2)取反加1(补码的补码是原码)
负数:-20
原码:1001 0100
反码:1110 1011
补码:1110 1100
1110 1011 = 1001 0100(-1,取反)
1001 0011 = 1001 0100(取反,+1)
unsigned:只有正数,原、反、补一致
作用:声明无符号的整数类型
无符号数在计算机中的表示方法:计算机用原码表示无符号数
-无符号数默认为正数n
-无符号数没有符号位无符号数最小值为0,最大值为其所占的位数全为1时的值。
printf("%d, %u", a, b); /* %u是unsigned类型的说明符 */
printf("%u, %d", a, b); /* 如果对signed类型的变量用%u,那就不会去找内存中的符号位,全部当数字位处理 */
/* 这时显示的结果可能与signed本身想表达的值差异很大,数字0情况除外 */
unsigned short c = 4;
printf("%hu"); /* %h是短整型,%hu表示无符号短整型 */
unsigned long d = 5;
printf("%lu"); /* %l是长整型,%lu表示无符号长整型 */
5.6 字符型
值域范围:
char(1byte): 1byte = 8bit
unsigned:0000 0000 ~ 1111 1111 0 ~ 255
signed:1000 0000 ~ 0111 1111 -128 ~ 127
值域范围:
int(4byte)
unsigned:
0000 0000 0000 0000 0000 0000 0000 0000 ~ 1111 1111 1111 1111 1111 1111 1111
1111 0 ~ 2^32-1
signed:-2^31 ~ 2^31-1
案例
(1)char a = 130; 1000 0010 2
printf("a = %d\n",a);
(2)unsigned char a = 260;
printf("a = %d\n",a);
1、已知值域范围,可求越界
2、先将其转换为二进制,截取其数据类型有效位数,其余舍弃
5.7 浮点型
浮点型的存储方式和整型存储方式是不一样的
浮点型的存储方式决定了它不能准确的表示一个数,只能近似的表示某一个数
float(4byte):有效数据的位数一般是6~7位,余处位数不再精确,可能为随机值
double(8byte):有效数据位的位数一般是15~16位
6、常量
在程序运行期间不会发生改变的量(从程序开始到结束都不会发生改变的量)
6.1 字符常量
'a' 'b' 'c' 'd'
6.2 整型常量
二进制:1101
八进制:077
十进制:24
十六进制:0xAF
注意:默认情况下,整型常量是有符号的int类型
无符号的整型常量:66U
长整型:66L
无符号的长整型:66UL
6.3 浮点型常量
小数形式:1.23 0.0001 10000(浮点型常量包含整型常量)
%g会自动选择小数形式或指数形式表示
指数形式:0.0001 (1e-4) 10000(1e+4)
6.4 字符串常量
“hello” <==> {'h','e','l','l','o','\0'}占几个字节
**注意:字符串是以'\0作为结束符'**
6.5 标识常量(宏)
#define 宏名 表达式
注意:
(1)宏名一般用大写来表示,小写也可以,因为为了和变量区分,所以用大写
(2)宏后面没有分号
注意:宏只是单纯的替换
宏函数(既有宏的特点又有函数的特点)
#define 函数名(形参) 函数体
案例1:利用宏函数实现两个数的求和
注意:使用宏函数时必须加上括号
注意:宏只是单纯的替换,不会考虑运算符优先级的问题,所有每个变量以及整个表达式添加括号
作业
求short值域范围
值域范围:
short(2byte): 2byte = 16bit
unsigned:0000 0000 0000 0000 ~ 1111 1111 1111 1111 0 ~ 2^16-1
signed:1000 0000 0000 0000 ~ 0111 1111 1111 1111 -2^15 ~ 2^15-1