一、C语言的操作对象
C语言的操作对象:资源/内存(内存类型的资源,LCD缓存、LED灯、串口、I2C设备等)
C语言如何描述这些资源的属性
资源属性即大小
限制内存(土地)的大小,关键字==》char int long short 等
二、编译器与硬件
定义int a; sizeof(a) 的值到底是几,这是取决于编译器,针对不同的硬件(架构、字长)会采用不同的编译器,sizeof默认返回unsigned long类型 因此在打印sizeof的值时建议使用lu
三、基础数据类型
1、 char类型
硬件芯片操作的最小单位
bit 1 0
软件操作的最小单位:8 bit == 1B
应用场景:
(1)硬件处理的最小单位
比如硬件要发送一个字符串“12345”,此时,很明显,使用char buf[XX]比int buf[XX]更合理
(2)ASCII码表 没有中文概念时,用8bit去描述键盘键值是足够的
2、int 类型
编译器最优的处理大小:
系统一个周期,所能接受的最大处理单位==>int
32位机 32bit 4B int
16位机 16bit 2B int ==》 TC2.0
整型常量
char a = 300; 300为整型常量,编译器会默认按int大小分配空间
与变量名的区别:变量名必须是以字母数字下划线开头,所以,任何以数字开头的字符串都被认定为常量,比如0b110011(2进制), 010(8进制),0x11(16进制),123(10进制)
16位机整型int为2个字节,最大表示的数为65536 当使用66666的整型常量时,虽然会通过编译,但是由于编译器按照整型int来存储66666,因此会造成错误。
==》解决方案:在数字后加上l或者L 66666l 或 66666L 显式告诉编译器以long类型给常量分配空间
3、short 当变量的分配空间有着严格的限制,必须刚好和short一样大时采用short类型
4、long 一般用于变量大小的扩展 比如long long 用于大数据
5、逻辑类型 bool :使用时需要头文件 stdbool.h
值域: true(非零)、false(零)
特点:非零为真,零值为假。
6、unsigned signed 有符号数和无符号数的区别
内存空间的最高位(bit)是符号位还是数据
无符号:数据采集(摄像头数据,显卡产生的数据)
有符号:数字运算(+-*/)
7、float double 类型
内存存在的形式
数字形式:0x10 16进制
内存形式:0001 0000 16
注:浮点数在内存中的表现形式在不同的计算机体系中是不一致的,因此无需关注
大小:
float 4B
double 8B
浮点型常量:
1.0 1.1 编译器给浮点型常量默认分配为double类型,8B
1.0f 1.1f 显式告诉编译器浮点型常量分配为float类型,4B
8、void 类型
void a 只是一种声明,并不实际分配空间,在实际的使用中一般会进行强转,强转之后编译器才会指定变量占用的空间。或者用于函数的返回值声明,表示没有返回值。
注:在不同的系统中,各种类型数据长度不一致,但是都遵循该原则:长整型的字节大小至少要不小于整型的字节大小,整型的字节大小至少要不小于短整型的字节大小。
有待考究的问题:
右移操作时必须关注数据是否是有符号的
比如:char a = -1; 0xff
a>>1 不断的右移1位 ==》无法变成0 ????????
unsigned char b = -1;
b>>1 不断的右移1位 ==》最后会变成0 ????????
四、自定义数据类型
C编译器默认定义的内存分配(基础数据类型)不符合实际资源的形式,就形成了自定义数据类型(基本元素的集合)
1、struct 元素之间的和
struct myabc {
unsigned char a;
unsigned int b;
usigned long c;
};
struct myabc mybuff;
struct 是告诉编译器即将定义一个自定义数据类型
myabc不是变量,而是自定义数据类型的名称
mybuff 是变量名 struct myabc是类型修饰
顺序也是有要求的,顺序的不同也会对最终的结构体大小产生影响(内存对齐)
(2)union
共用起始地址的一段内存
应用于一些技巧性的代码
union myabc {
char a;
int b;
};
变量的定义方式:union myabc abc;
(3)enum类型
enumerate:一一列举
被命名的整型常数的集合
enum 枚举名称{常量列表};
情形1:
#define MON 0
#define TUE 1
#define WED 2
情形2:
enum abc{MOD = 0,TUE,WED}
情形1和情形2等价
举例:
enum week{
Monday = 0,Tuesday = 1,Wednesday = 2,
Tuursday,Friday,
Saturday,Sunday
};
enum week day;
enum week 声明day是一个week类型枚举类型,day分配的空间同整型常量(int,Sizeof(day) =4),原则上限制day的取值只能为0~6,但是很多编译器其实只是把day当成一个int大小内存空间的名称而已,并不会真的限制其取值,所以day = 8,很多时候也是成立的,具体的和编译器也有关系
Enum多数情况下只是将某一类的整型常量放到一起,起一个适合实际应用的名称,方便阅读和理解。
(4)typedef
数据类型的别名
情形1:
int a = 170;
int b = 3600;
只知道分配了int大小的空间,但是并不知道a和b的用途
情形2:
len_t a = 170;
time_t b = 3600;
直观的了解到a是用来表示长度,b是用来表示时间
举例:
int a ==》a是一个int类型的变量
typedef int XXX_t XXX_t是一个int类型的外号
XXX_t mysize; 定义一个int类型的变量mysize
XXX_t:在linux编程中,这种类型基本都是使用typedef来定义的
五、关于常量
常量:在整个程序运行过程中其数值不发生改变的数据。
不能进行自增、自减运算。++ 、–。
常量不能作为赋值运算符的左值。
1、整型常量 : 整数
2、浮点常量 : 实数
3、指数常量:+/-1.178e+/-13 == +/-1.178 * 10^13 或者 +/-1.178*10^(-13)
4、字符常量:用单引号‘’引起来的单个字符
字符常量具有数值,其数值为字符的ascii码值
5、字符串常量:使用双引号“”引起来的一串字符。
“beijing” “北京” “1234” “ >>>”
6、标识常量:又称为宏。便于程序的修改调试,增加程序的可读性
一般形式: #define 标识常量名 表达式
宏替换为格式的完全替换