天天看点

C语言中对数据类型的理解

一、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 标识常量名 表达式

宏替换为格式的完全替换

继续阅读