数据在计算机内部的表示
常用的进位制
R进制数只采用R个基本数字符号,R称为数制的基数
,数制中每一固定位置对应的单位值称为权
,进位原则是逢R进1
.
比如二进制,那么基数就是2,数字符号就是0,1
再比如八进制,则基数为8,数字符号为0,1,…,7(共8位).
注意在16进制中,基数为16很自然,但是数字符号应该是0,1,2,…,15,然而以为数只能到9,所以16进制的10用A来表示,11用B来表示,这样子一直下去,到15用F表示.
数值与字符在计算机中的表示
计算机中数值型数据的编码
- 机器数与真值
通常一个数的最高位为符号位
,用0表示正,1表示负
,称为数符
若机器的字长为8位,则$D_7$为符号位,$D_6$到$D_0$为数值位,比如$(11100001)2=(-97){10}$
机器数:机器内存放的正负符号数码化的数
比如真值$(-1100001)_2$的机器数是11100001
另外为了运算方便,机器数中的负数有3种表示方法:原码
,补码
,反码
- 定点数和浮点数
定点数分为定点整数
和定点小数
,利用浮点数可以扩大实数的表示范围,即科学计数法
.
计算机中字符型数据的编码
ASCII码
汉字编码
字符集和保留字
基本符号集
数字10个
0,1,2,…,9大小写字母各26个
下划线
- 特殊符号
标识符
- 用户标识符
即用户自定义的变量名字,要求由字母,数字,下划线
组成,且不能以数字开头
,区分大小写
- 保留字
自带的,比如char,int
等,总计32个
- 预定义标识符
#define
和#include
之类的,挺有用的
C语言的数据类型
- 基本类型
整型(int,short,long)+实型(float,double)+字符型(char)
- 构造类型
数组类型+结构体类型(struct)+共用体类型(union)+枚举类型(enum)
- 指针类型
指针类型(*)
- 空类型
空类型(void)
常量
数值常量
- 整型常量
八进制整型常量必须以0开头,数码取0~7,通常是无符号数
十六进制整型常量的前缀为0X或0x,数码取值0~9,A~F或a~f
十进制整型常量无前缀,数码为0~9
- 实型常量
也就是我们所说的浮点数
小数形式+指数形式(科学计数法)
字符常量和字符串常量
- 字符常量
用单引号
括住,可作为整数常量来处理(指ASCII值),a='a'+1=97+1=98
还有一些不可显示的字符,如换行,回车等,以反斜杠开头
注意转移字符的使用,比如'\"'
表示双引号,'\\'
表示反斜杠
- 字符串常量
用双引号
括住,比如”I love China!”
注意转义字符的使用:比如he said he is a "super man"
可以表示为"he said he is a \"super man \""
,程序如下:1
2
3
4
5
6
void main()
{
printf("he said he is a \"super man\"");
}
输出结果:1
he said he is a "super man"
不同于字符常量的是,字符串常量以'\0'
结束,但不显示'\0'
,从而C语言中字符串的长度不受限制
符号常量
#define PI 3.1415926
诸如此类,必须大写
变量
变量3要素:变量名+变量的存储单元+变量(存储单元存放)的值
变量的定义
定义变量3要素:存储类型(auto,static)+数据类型+变量名
通常我们省略的存储类型,默认是auto
,即都会把变量存放在动态存储区
(栈区),这种变量在程序运行过程中实时分配和释放.
而static
定义的变量的存储方式是静态存储
的,静态局部变量是放在静态存储区的
,在整个程序运行期间都不释放,跟全局变量一样长期占用内存。但是静态局部变量和全局变量还是不一样的,比如说,静态局部变量只能在所定义的函数内引用,静态局部变量在函数调用结束后是仍然存在的,但不能被其他函数引用。静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已经有了初值,以后每次调用函数时不再对其重新复制,而只是保留上次函数调用结束时的值。在定义静态局部变量时,如不赋初值,则编译时自动赋初值为0。有时在程序设计中定义一个全局变量,只限于被所在源文件引用,而不想让其他文件引用,则可在定义全局变量前面加static,即静态全局变量。(此段引用自https://blog.csdn.net/he__yuan/article/details/79477882)
- 整型变量
基本型int
,占4字节
短整型short int
或者short
,占2字节
长整型long int
或者long
,占4字节,与基本型一样
无符号型unsigned
对于无符号型,由于没有符号位,所以不能表示负数
- 实型变量
单精度类型
(float,占4字节)和双精度类型
(double,占8字节)
- 字符变量
char
,占1字节,每个字符只能防放一个字符,由于C语言中没有字符串变量,如果需要把字符串放在变量中,就需要一个字符型数组来实现
比如下面这各个,我将字符串常量
“china”赋给a这个变量
,由于上述原因,a只能接受一个字符,故产生异常:1
2
3
4
5
6
7
8
void main()
{
char a="china";
printf("%d",a);
}
输出:1
2
3
4p0.c: In function ‘main’:
p0.c:4:8: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
char a="china";
^~~~~~~
而将”china”这个字符串改为字符’a’,再次运行: 1
2
3
4
5
6
7
void main()
{
char a = 'a';
printf("%d", a);
}
就能正常输出’a’的ASCII码的值了,即97.
变量的存储
存储某变量的内存空间的首地址称为变量的地址,变量地址用&变量名
来表示,&
表示取地址,即取存储空间首地址
注意:虽然地址的值在形式上和整型数一样,也可以用十进制或者十六进制表示,但意义不一样.整型数有算数,关系,逻辑等运算,而地址只有有限的算数运算和关系运算
.
还有,地址的值一定是一个整型量
.
变量的初始化
直接举个栗子:1
2
3int a,b;
a=1;
b=2
等价于1
int a=1,b=2;
数据的输入和输出
C语言的所有输入和输出操作都是调用标准I/O库函数
格式输入/输出函数
- 格式输入函数
printf(格式控制字符串,输出项表)
- 格式输入函数
scanf(格式控制字符串,输入项地址表)
字符输入/输出函数
- 字符输出函数
putchar(ch)
,ch
可以使整型变量或者字符型变量.
这将输出字符,比如:1
2
3
4
5
6
7
8
void main()
{
char a = 'a';
int b=97;
putchar('\n');
putchar(a);
}
这将输出两个a,各占一行,即1
2a
a
提示:97是’a’的ASCII码.
- 字符输入函数
getchar()
,无参数
举个例子就清楚了:1
2
3
4
5
6
7
void main()
{
char a ;
a=getchar();
putchar(a);
}
输入a,程序将输出a