十、进制
进制:按照某种计算规则,实现进位的方式
描述:逢多少进一,借一当多少
数值的构成:数码,位权,基数
十进制:
153=1*100+5*10+3
1*10^2 5*10^1 3*10^0
位权: 10^0 10^1 10^2.....
基数:10
数码:0---9
10.1 进制的表示
- 二进制B:0b
- 十进制D:默认不写
- 八进制O:0
- 十六进制H:0x
10.2 进制转换
10.2.1 十进制 与 N 进制 互转
10.2.1.1 十进制转 N 进制
- 除以n逆向取余
下图中十进制转二进制
10.2.1.2 N 进制转 十 进制
- 位权展开求和
下图中二进制转十进制
10.2.2 二进制 转 八进制 与 十六进制
二进制转八进制:
从后往前,每三个二进制的数算一个八进制的数,挨着往前写。
二进制转十六进制:
从后往前,每四个二进制的数算一个十六进制的数,挨着往前写。
八进制、十六进制转二进制:
转回来也是类似的思维,逆着思考就行了。
10.3 二进制数
- 逢二进一,借一当二。
- 分为有符号数和无符号数。
- 有符号数:最高位表示符号位(0表示正,1表示负数),其余为表示数值位。
- 无符号数:每一位都表示数值位。
此处借用Yale.patt (http://www.ece.utexas.edu/people/faculty/yale-patt)老先生出的《instruction to computing systems》第二章的图2.1。
这个地方使用的是六个bit表示的数。
- 从左往右依次是无符号数,有符号数,一的补码,二的补码。
- 一的补码国内翻译大多都是反码。
- 一的补码国内翻译大多都是补码。
10.3.1 有符号数 与 二的补码 的转换
有符号数 ==> 二的补码 :
- 如果是正数,这里都一样。
- 如果是负数,那么符号位不变,其余位逐位取反,末位 + 1。
二的补码 ==> 有符号数 :
- 如果是正数,这里都一样。
- 如果是负数,那么符号位不变,先末位 - 1,在逐位取反。
十一、常量与变量
11.1 C 的关键字
11.2 数据类型
- 其中 long 根据系统的不同,会有不同的情况
- 在32位系统中,long占4字节。
- 在64位系统中,long占8字节。
11.3 存储类型
- auto: 自动类型,默认不写就是自动类型
- static: 静态数据类型,延长生命周期
- extern: 外部变量
- register: 寄存器变量 访问速度快
下面俩不属于存储类型,是修饰符
const: 修饰,值不可以修改
volatile: 保持内存的可见性
11.4 变量的定义格式
- 值可以变的量
存储类型 数据类型 数据名;
11.5 ASCII 码
- 注意:这个ASCII的音标为 [ˈæski],读作 唉丝ki,不读 啊丝克!!!!!!
- 可以通过 控制台命令:man ASCII 查看ASCII编码
11.6 常量
- 常量就是值不可以变的量。
- 数字、字符、宏这些都属于常量的范畴
11.7 宏
宏的格式:
#define 宏名 宏值
注意:
- 宏的位置一般在头文件的下面或者上面,有时也会写到代码块里面,看需求如何。
- 宏名一般为全大写的字母或字母串
- 宏值后不要跟分号了“;”
- 宏只是替换,不参与计算,也不会检查是否正确,在预处理阶段就被换掉了
十二、输入与输出
12.1 printf
头文件: #incude <stdio.h>
格式: int printf(const char *restrict, ...);
返回值: int 表示输出字符的个数
printf: 函数名 系统库函数
参数: const char *restrict 表示格式控制串
,: 当后面存在输出列表是不可以省略
... : 输出列表
使用格式:printf("字符串");
printf("%d %d %ld" ,a,b,c ); //多个参数列表使用逗号隔开
12.2 scanf
注意:
1. 结束整个scanf函数需要使用回车
2. 在输入元素时,中间使用空格,tab,回车 也都会被认为是输入了一个字符
3. 输入函数不要添加\n \t
4. 当输入字符是需要注意吸收垃圾字符 【空格、%*c】
头文件: #include <stdio.h>
格式: int scanf(const char *format, ...);
返回值: int 表示输入的个数
scanf: 函数名,系统库函数
参数: const char *format 表示格式控制串,一般是格式控制符
,: 不可以省略
...: 地址列表,多个地址列表之间使用逗号隔开
使用格式:scanf("",....);
int a;
scanf("%d",&a);
1> 格式控制串只有格式控制符【建议】
int a;
scanf("%d",&a);//输入一个
short b;
long c;
scanf("%d%ld",&b,&c);//输入多个
2> 格式控制串存在其他字符
scanf("a=%d,b=%hd,c=%ld",&a,&b,&c);
printf("a=%d\n",a);
printf("b=%d\n",b);
printf("c=%d\n",c);
3> 输入浮点型
float m;//1.2
double n;//2.333
//输入不需要确定精度
printf("please enter m,n:");
scanf("%.1f %.3lf",&m,&n);
printf("m=%.1f n=%.3lf\n",m,n);
4> 输入单字符
char a,b,c;
//空格:吸收垃圾字符空格、tab\回车
//抑制字符:%*c 可以吸收任意垃圾字符
scanf("%c%*c%c%*c%c",&a,&b,&c);
printf("a=%c b=%c c=%c\n",a,b,c);
12.3 getchar
格式: int getchar(void);
返回值: int 表示输入字符的ASCII
getchar:单字符输入函数
参数: void 空
作用: 输入字符、吸收垃圾字符
使用格式:
char a,b;
a=getchar();
b=getchar();
char a,b,c;
//空格:吸收垃圾字符空格、tab\回车
//抑制字符:%*c 可以吸收任意垃圾字符
//scanf("%c %c %c",&a,&b,&c);
// scanf("%c%*c%c%*c%c",&a,&b,&c);
// scanf("%c",&a);
// scanf(" %c",&b);
// scanf("%*c%c",&c);
printf("please enter a:");
a=getchar();
printf("please enter b:");
getchar(); //吸收垃圾字符
b=getchar();//输入
printf("please enter c:");
getchar(); //吸收垃圾字符
c=getchar();
printf("a=%c b=%c c=%c\n",a,b,c);
putchar(a);putchar(10);
putchar(b);putchar('\n');
putchar(c);putchar(10);
12.4 putchar
格式: int putchar(int c);
返回值: int 表示输出字符的ASCII
putchar: 系统函数
参数: int c 表示输出字符的变量名
使用格式:
char a='S';
putchar(a);
putchar('S')
putchar(10);
12.5 scanf和getchar之间的区别
1. scanf可以输入任何类型且多个,getchar只能输入单字符且一个
2. scanf属于格式解析输入,getchar输入键盘读取
3. scanf速度慢,getchar相对速度较快
12.6 printf和putchar之间区别
1. printf可以输出任何类型且多个,putchar只能输出单字符且一个
2. printf属于格式解析输出putchar输出不需要解析
3. printf速度慢,putchar相对速度较快
12.7 sizeof
用于计算变量或类型所占的字节
size_t sizeof(数据类型或变量);
size_t ---->unsigned int /long
小作业:写一个小程序,完成输入一个大写字符,输出对应的小写,以及ASCII值的功能
- 下面是我写的