- 变量:在程序执行过程中其值可以改变的量叫做变量
-
常量:在程序执行过程中其值不能改变的量
常量定义的格式:
1.Const float pi =3.14159; //const 修饰的变量为常量
//Pi=3.2; //err const修饰的变量不能再次赋值,但可以参与计算
2. 常量定义第二种方式:#define 常量值 值 即#define MAX 100
3. 定义标识符
标识符可以包含字母、数字、下划线,第一个字符必须为字母下划线,不能使用c语言关键字
标识符定义时见名之义
-
声明和定义的区别,声明变量不需要建立存储空间
定义变量需要建立存储空间,如:int b;
如extern关键字只做声明,不做任何定义
Int b 它既是声明,同时又是定义
-
进制间转换
- 十进制转为二进制:除二取余,倒排序法
- 二进制转为10进制:权值法 即二进制1010 = 0*2^0+1*2^1+0*2^2+1*2^3= 10
-
为什么用A…F代表16进制的10…15
因为10在16进制数中会让程序员搞不清是一位数还是两位数,所以用A..F代表两位的数值。
- 在二进制转10进制时可以使用8421法则:即二进制转换成10进制时可以依次加上2的n次幂
-
十进制的小数转换成二进制,小数部分跟2相乘,取整数,不足1取0,每次相乘都是小数部分,顺序看取整后的数就是转化后的结果。
如下二进制:101011
8421法则 | 32 | 16 | 8 | 4 | 2 | 1 |
二进制数101011 | 1 | 0 | 1 | 0 | 1 | 1 |
十进制数 | 32 | 0 | 8 | 0 | 2 | 1 |
十进制数相加后结果 | 43 |
|
|
|
|
|
-
二进制数和八进制间相互转换
将二进制数从末尾开始三位分割再转化成八进制
将一个八进制数转换成二进制如果数不够用0补位
-
二进制和十六进制间相互转换
将二进制数从末尾开始四位分割再转成十六进制
- 八进制转换成十六进制,需要以二进制为中间键再转换成十六进制
-
如何表示相应进制数
十进制:采用1-9来开头来表示
八进制:以数字0开头如:0123
十六进制:以0x开头如:0x32
-
在c中表示各个进制
十进制
【数据类型 变量 值】
八进制
【数据类型 变量 0+值】
十六机制
【数据类型 变量 0x+值】
打印各个进制
%d 以有符号十进制打印
%o 以八进制打印
%x 以十六进制打印
%u以无符号十进制表示
%hd %hu短整形
%ld %lu长整型
%c 字符型打印操作
%f 单精度浮点型打印
%lf 双精度浮点型打印
%E %e 以科学计数法打印 如果e/E后的为正数则为指数 如果为-e 则为十分之一的方式
- 二进制数不能在C语言中出现
-
十进制小数转换成二进制数
有几位小数就求出几位二进制
每次乘以2
如果个位有1就取出来
如果个位为0也取出来
然后正序排列
-
有符号型的数据,最高位为符号位
数据在计算机中的存储方式
原码:既是一个数的原始二进制码
反码:如果是正数,原码与反码相同。如果是负数,最高位符号位不变,其余各位取反
补码:如果是正数,补码与原码和反码都一致,如果是负数,是反码加1
计算机中的计算:计算机中存储的是补码的形式,相加相减都是以补码的形式操作的,因为计算机只会做加法,一个正数和一个负数相加用两个数的补码直接相加就可以了。
另一点:在反码中+0(0000 0000)和-0(1111 1111)两种表现形式 ,如果计算机采用补码方式存储救恩能够避免+0和-0 的两种不同值的bug,即+0(0000 0000)和-0(10000 0000)由于只用8位描述,最高位1丢弃,变为0000 0000
- 统一了0的编码 将-0的存储区间的最小值
- 符号位会参与计算
- 将所有减法变成加法运算
-
如果两个数相加会溢出最高位
B的范围-128~127 对称下来是0~127和-1~-128两种
例如:
-
59-47??
59
原码:0011 1011
反码:0011 1011
补码:0011 1011
-47
原码:1010 1111
反码:1101 0000
补码:1101 0001
0011 1011 +
1101 0001
= 1 0000 1100 最高位溢出 符号位发生变化 结果变成整数 结果为12
68 -72??
原码:0100 0100
反码:0100 0100
补码:0100 0100
原码:1100 1000
反码:1011 0111
补码:1011 1000
0100 0100
1011 1000
1111 1100 补码
1111 1011 反码
1000 0100 -4
6.Sizeof 关键字
-
Sizeof是一个运算符,也是关键字,不需要包含任何头文件。求出数据类型在内存中占的内存大小
各数据类型所占内存大小
(Char) 1B
(short)2B
(int)4B
(long)4B (32位系统中占4个字节,64位操作系统中占8个字节)
(long long) 8B
(float)4B
(double)8B
无符号数据
Unsigned 数据类型 变量名 值
最高位不再是符号位而是数字位
例如:有符号short 2B
0111 1111 1111 1111 32767 最大值
1111 1111 1111 1111 -32768最小值
7.ASCII 码表值
- 字符0 对应10进制数为48
- 字符a 对应10进制数为97
- 字符A 对应10进制数为65
- 字符' ' 对应10进制数为32
转义字符
转义字符 | 含义 | 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进制 |
printf("%d\n", '\123');// '\123'为8进制转义字符,0123对应10进制数为83
printf("%d\n", '\x23');// '\x23'为16进制转义字符,0x23对应10进制数为35
数据类型 | 占用空间 | 取值范围 |
char | 1字节 | -128到 127(-27 ~ 27-1) |
unsigned char | 1字节 | 0 到 255(0 ~ 28-1) |
数据类型 | 占用空间 | 有效数字范围 |
float | 4字节 | 7位有效数字 |
double | 8字节 | 15~16位有效数字 |
8.实数类型
float和double
- Double类型比float类型更精确
- 打印时如果只想要小数点后三位,增加 %.3f
9.字符和字符串的区别在于
字符没有\0结尾
字符串是以\0结尾 \0是隐藏起来的。
10.格式化输出
Printf("字符串");
Printf("占位符");
printf格式字符:
打印格式 | 对应数据类型 | 含义 |
%d | int | 接受整数值并将它表示为有符号的十进制整数 |
%hd | short int | 短整数 |
%hu | unsigned short | 无符号短整数 |
%o | unsigned int | 无符号8进制整数 |
%u | unsigned int | 无符号10进制整数 |
%x,%X | unsigned int | 无符号16进制整数,x对应的是abcdef,X对应的是ABCDEF |
%f | float | 单精度浮点数 |
%lf | double | 双精度浮点数 |
%e,%E | double | 科学计数法表示的数,此处"e"的大小写代表在输出时用的"e"的大小写 |
%c | char | 字符型。可以把输入的数字按照ASCII码相应转换为对应的字符 |
%s | char * | 字符串。输出字符串中的字符直至字符串中的空字符(字符串以'\0'结尾,这个'\0'即空字符) |
%p | void * | 以16进制形式输出指针 |
%% | % | 输出一个百分号 |
printf附加格式:
字符 | 含义 |
l(字母l) | 附加在d,u,x,o前面,表示长整数 |
- | 左对齐 |
m(代表一个整数) | 数据最小宽度 |
0(数字0) | 将输出的前面补上0直到占满指定列宽为止不可以搭配使用- |
m.n(代表一个整数) | m指域宽,即对应的输出项在输出设备上所占的字符数。n指精度,用于说明输出的实型数的小数位数。对数值型的来说,未指定n时,隐含的精度为n=6位。 |
NULL 代表的是 (void*)0
练习:
计算如下程序结果
short a = 0xfffe; //0xfffe为补码
printf("%d\n", a); //结果为多少?
-2
unsignedshort a = 0xfffe;
printf("%u\n", a); //结果为多少?
65534
short a = 0x7fff + 2;
printf("%d\n", a); //结果为多少?
-32767
unsignedshort a = 0xffff + 5;
printf("%u\n", a); //结果为多少?
4