C语言基础(一)
一、代码在计算机中的运行
计算机的存储可分为内存和外存,内存空间相对较小(16GB、32GB),读写速度快,掉电丢失数据;外存相对较大,读写速度慢,掉电不丢失数据。
在编写好代码后保存退出并执行gcc命令会产生一个a.out文件,可执行程序(a.out)在 计算机的外存(ssd, flash)中存储,执行./a.out ,计算机会把a.out 中的内容(代码+数据) 加载到内存中,最后cpu 就会从内存中读出 代码+数据, 对数据进行相关操作。
二、计算机的数据单位的关系
1TB=1024GB
1GB=1024MB
1MB=1024KB
1KB=1024B
一个字节(byte)是八个比特位(bit),比特位有0/1两种状态,接下来引入进制。
二进制:逢二进一
十进制:逢十进一
八进制:逢八进一
十六进制:逢十六进一
三、进制转换
十进制转二进制: 对10进制数 一直除2 ,直到商为0 。并且记录余数,逆序组成的序列就是 对应的二进制数
十进制转八进制:对10进制数 一直除8 ,直到商为0 。并且记录余数,逆序组成的序列就是 对应的八进制数
十进制转八进制: 对10进制数 一直除16 ,直到商为0 。并且记录余数,逆序组成的序列就是 对应的十六进制数
二进制转八进制、十六进制的方法:将三个二进制数作为一组,三个二进制数是一个八进制数,2^3=8;同理,将四个二进制数作为一组,四个二进制数是一个十六进制数。
四、C语言关键字
五、基本数据类型 ,运算符,表达式
1.基本数据类型
整型类型
浮点类型
字符类型
缺省类型 void ,函数的返回值,函数参数
布尔类型 bool , <stdbool.h> 1 ture 0 false
2. 构造数据类型(用户自定义类型)
结构体
共用体
枚举
a)整数类型
1.可以分为有符号 和无符号
2. 整数数据在内存都是以补码形式存储的。
如果是正整数的话,补码就是原码本身
如果是负数的话需要计算补码, 1先获得原码(先绝对值,转二进制) ,2对原码取反操作(原码中的0
变1,1变0) 获得反码,3 对反码 +1 操作 。 加入以short 为例, 这个反码是 15bit ,在加上最高位
(符号位) 的1 。总共16bit。
sizeof是一个关键字sizeof(a)sizeof(10),sizeof(int) .获得对应类型的数据在,内存中占用的空间是多少个字节,以64位操作系统来说
b)字符类型
char 有符号 字符 1 byte (8bit) -128 - 127
unsiged char 无符号 1 byte (8bit) 0-255
字符类型的本质,其实是 整数。也就是 字符在存到内存中,存储的是字符对应的编码。
在c语言中char 类型表示单个字符,能够从键盘上输入的字符(大小英文字母,小写字母,标点符号)
一些特殊的控制字符也可以使用char 表示。(转义字符)
c)浮点类型
默认情况,浮点数都是符号。小数 。3.14 5.1231231231
float 单精度 4byte 32bit -3.402823^-38 - 3.402823^38
double 双精度 8byte 64bit -1.797693^-308 - 1.797693^308
IEEE 754 内存储存方式
float 1bit(符号位) + 8bit(指数) +23bit(尾数)
double 1bit(符号位) + 11bit(指数) +52bit(尾数)
3.常量,变量
1.常量:顾名思义,常量就是 在程序运行过程中,不会发生改变的量。 也是有数据类型的,常量可直接使用。
常量可分为整型常量、浮点常量、字符型常量以及字符串常量,其中字符串常量由多个字符组成的一个序列。
2.变量: 在程序运行过程中,可以发生变化的量。 都是有数据类型。变量在使用之前,需要先定义在使用。
变量的定义
数据类型 变量名;
变量名(标识符)的规则
1) 只能字母,数字,下划线。不能数字开头。
2) 变量名不要和系统的 关键字 重名。
3)变量名不要和系统的 函数 重名
4)变量名 见名知意。
3.变量中的值,可以发生变化的原因。 因为在定义变量的时候,系统会给变量开辟内存空间。
4.初始化
含义:在变量内存空间开辟的同时,装入初始值。
1) 变量定义后,如果没有给初值的,变量里就存储了随机值。
2)变量在定义的时候,最好都给初值。
表达式
定义:由一个或多个运算符连接起来的式子 。
特点:
1)表达式一定是有类型
2) 表达式一定是有值
运算符
1)算术运算符 + - * / % ++ –
2)关系运算符 > >= < <= == !=
3)逻辑运算符 && || !
单目: 运算符需要1个操作数
双目: 运算符需要2个操作数
% 运算符 的左右操作数不能是 浮点数
++i , 先加再用 , 浮点数 可以++ 操作
i++ 先用在加, 浮点数 可以-- 操作
混合数据类型运算
1) 如果相同类型的数据进行算符运算, 结果是相同类型
2)如果不同数据类型进行算符运算,就要转换为相同的类型 ,在计算结果 ,隐式转换(自动转换)
会把低精度的数据类型向高精度的数据类型转换
如果相同类型会向内存空间占用大的转换
会把有符号 -》 无符号 转换 short -> unsigned short
char ,short --> int 必转
单精度的浮点 -》 双精度浮点转换 必转
doubleret=0;inta=5;ret=(double)a/2;// 对5 进行强制类型转换,转换为double类型。强制类型转换 不会对变量本身,进行修改修改赋值运算符
=//赋值运算符 ,双目运算符 。+=-=*=/=1) 左值 ,可以放在赋值运算符的左侧,只能 变量,不能是常量,表达式(有值的,常量)。
右值 ,可以放在赋值运算符的右侧。可以是,变量,常量,表达式。
3) 在赋值运算符左右两侧 数据类型 (基本数据类型)不一致的,会按如下方式处理:
如果把浮点数 给整形数据赋值,则丢弃小数部分。
如果把整形数据 给赋值浮点数,扩展小数位。
如果左右两边空间大小一致,则完成内存空间的拷贝。
unsignedintnum=0;num=-100;// -100 以补码存储 ,num 是无符号的,16bit 都当数据为,值很大4294967196printf("num %u\n",num);//如果是内存空间占用小,存到内存空间大 。如果是正数, 高位补 0 。 如果是负值,高位补1 。char -》short;//如果把占用内存空间大的,向内存空间小的存储 。丢弃高位,高位截断。 short -》 char ;