Bootstrap

Linux嵌入式学习---C语言之数据类型及运算

一、Linux下c语言概述

注:c语言的基础参考谭浩强《c语言程序设计》第五版,以下内容适用于初学Linux嵌入式学习,写的不容不仅要理解更是要边敲代码边理解文中内容,多动手。**也是为了方便自己整理一份笔记,便于自己复习,如果内容有错误,欢迎大家指出。

1.1C语言特点

c语言具有汇编语言和高级语言的优点,既适用于开发系统软件,又适用于编写应用程序,被广泛的应用于事务处理,科学计算,工业控制,数据库技术等领域。

1.2c语言是结构化的语言

c语言采用代码和数据分隔的方式,使程序的各个部分除了必要的信息交流外彼此独立。这种结构使程序层次清晰,便于使用,维护,以及调试。

c语言是以函数形式提供给用户的,这种函数可以被方便的调用,并且有多种循环语句,条件语句,控制语句,使程序结构化。

1.3c是模块化的语言

c主要用于编写系统软件和系统软件,一个较大的系统需要分配成若干个模块,每个模块实现特定的功能。c语言中以函数作为程序的模块单位,不仅可以减少重复代码的编程,放在函数库中还可以被其他函数调用。

1.4程序可移植性好

程序的代码,80%是公用的,可以不用做任何修改可以用于任何计算机和操作系统。

1.5c语言运算符丰富,代码效率高

c语言的运算符较多,编写代码质量高。

二、数据类型

2.1常量和变量

2.1.1常量:在程序运行中不能被更改的的量。

①:整型常量:1,-2,0等
②:实型常量包括(小数和指数)
例如:
12.9,-9.8;
:1e3 -------表示1x10^3
:-1.3e-9-------表示-1.3x10^-9
注意:e前面必须要有数字,e后必须是整数
③:字符常量
例如:
‘A’,‘a’(只能放单个字符,且是单撇号
‘\n’,转义字符(查看转义字符表)
④:字符串常量(必须是双撇号)
例如:“hello”,“BEIJING”
⑤:符号常量
用#define 指令,指定一个符号名称代表一个常量
符号常量是不占内存的,只是一个临时符号,代表一个值

在程序中多处用到同一个常量的时候,可以做到一改全改。
例如:
#define PI 3.14
这里PI表示3.14,符号常量经常用大写表示
注意没有分号

2.1.2变量:变量的值是可以改变的,是一个有名字和特定属性的存储单元,存放数据,存放变量的值。
类似于数学中y=x(k>0),一次函数中的x;
从变量取值,实际是通过变量名找到相应的内存地址,从该存储单元读取数据。
变量必须先定义再使用

例如:
int a = 3; //定义了一个int整型类型的变量a;

2.1.3常变量:在定义变量的时候,在前面加const的关键字。且不能改变其值。

2.14标志符:只能由字母,数字,下划线3种字符组成,且第一个字必须为字母或者下划线组成。大写字母和小写字母是两个不同的字符。

例如:
sum;Sum;_toal;name_1;

2.2数据类型

2.2.1基本类型:整型,和浮点类型
①整型:基本整型(int),短整型(short int),长整型(long int ),
双长整型(long long int ),字符型(char ),布尔型(bool)
②浮点型:单精度浮点型(float),双精度浮点型(double),
复数浮点型(float_complex,double_complex,long long_complex)

2.2.2枚举类型(enum),空类型(void)

2.2.3派生类型
①指针类型(*)
②数组类型([])
③结构体类型(struct)
④共用体类型(union)
⑤函数类型

2.3整型数据

2.3.1数据分类

1字节=8位

(1)基本类型(int型)
根据编译器的不同:2个字节或4个字节
(一般编译系统为4字节)
存储方式:按整数的补码存放
正数补码就是二进制
负数补码=正数原码按位取反+1
最左位0表示正数,1表示负数

(2)短整型(short)
2个字节
可以用头文件#inlcude <limits.h>

(三)长整型(long int )
4个字节

(四)双长整型(lomg lomg int)

注意: long的数据长度不短于int型,short型不长于int型
sizeof(short)≤sizeof(int)≤sizeof(long)≤sizeof(long long)

在这里插入图片描述

常见的整型数据类型

常见整型类型字节大小
int4字节
(无符号)unsigned int4字节
short2字节
unsigned short2字节
long4字节
unsigned long4字节
long long8字节
unsigned long long8字节

无符号类型(unsigned)只能存放不带符号的整数,不能存放负数
因为无符号的最高位只能存放二进制数值,不能存放符号位,所以左边的最高位不用来表示符号(0代表正数,1代表负数),无符号类型 的范围比有符号类型的范围大一倍

整型(int)和字符型(char)可以加unsigned修饰符,对于无符号十进制格式输出,用“%u”的格式进行输出。

2.4字符型数据

字符型属于整型类型的一种。

程序可以识别的是系统的字符集,这个时候就要对照ASCII表
一个字节存储一个字符,字节中的第一位置为0

区分字符’1’和数字1的不同
字符’1’:表示一个形状为’1’的字符,占一个字节,ASCII码中为49;
数字1:是以二进制补码方式存储的,占2个或4个字节(根据编译系统决定)

思考:
整数1+1 = 2;
那么字符’1’ + ‘1’ 等于多少呢?

char a = ‘a’;//定义一个字符类型的变量;
输出格式:
%d ----输出十进制整数
%c ----输出字符

在这里插入图片描述

类型字节数
char1
unsigned char1
2.5浮点型数据

浮点数类型:①单精度浮点型(float)②双精度类型(double)③长双精度浮点型(long double)

①单精度浮点型(float)----4字节
因为存储单元的长度是有限的。所以不可能得到完全精确的值,只能存储有限的精确度。
float只能存放6位有效数字。

②双精度类型(double)----8字节
在进行浮点数的算数运算时,将float类型数据都自动转化为double类型的数据,然后在进行运算。
有效数字15位

③长双精度类型(long double)----16个字节或者8字节
有效数字19位或者15位

2.6小结

(1)浮点型常量都是按双精度处理,分配8个字节。
float a = 3.14159;
对于float变量分配4个字节,对于浮点型常量3.14159,则按双精度处理,分配8个字节。系统会有警告,对精确度有影响,但是不影响正确性。
(2)可以在常量的末尾加专用字符,强制指定类型常量。
例如:
float a = 3.14159f;//按单精度浮点常量处理,编译不会出现警告
long double a = 1.23L;//作为long double型处理
(3)每一个变量属于一个确定的类型,类型是变量的一个重要属性。
变量占用存储单元,是具体存在的实体,在其占用的存储单元中可以存放数据。而类型是变量的共性,是抽象的,不占用存储空间,不能用来存放数据。

三、运算符及表达式

对程序进行加工处理,就需要使用规定的运算符,才可以进行运算。

3.1基本类型运算符概述

运算符表:

类型符号
算数运算符(+ - * / % ++ --)
关系运算符(> < == >= <= !=)
逻辑运算符(! && 11)
位运算符(<< >> ~ 1 ^ &)
赋值运算(= 及其扩展运算符)
条件运算符(?:)
逗号运算符(,)
指针运算符(*和&)
求字节数运算符(sizeof)
强制类型转化运算符((类型))
成员运算符(. ->)
下标运算符([ ])
其他(如函数调用运算符())

3.2基本算数运算符

运算符含义
+单目运算正号(+a)
-单目运算符负号(-a)
*乘法
/除法取整
%求余
+加法a+b
-减法a-b

注意:
①如果除数或者被除数是负数,则舍入方向不确定。
-5 / 3 = -1
-5 / 3 = -2
多数是取整后向零靠拢
②%运算对象必须是整数,float和double不能取余。

3.3++和–运算符

运算符含义
++i使用i之前,先使i的值加1
i++使用i之后,使i的值加1
–i使用i之前,先使i的值减1
i–使用i之后,使i的值减1

在这里插入图片描述

3.4表达式和运算符的结合

只要知道:(复杂的情况查一下表)
算数运算符:自左至右
赋值运算符:自右至左

3.5混合运算

(1)+,-,*,/,运算的两个数中有一个数为float或者double型,系统会把float型转化成double型,然后在进行运算,结果是double型。
(2)int和float或者double运算,最后结果都是double型。
(3)char型与整型运算,是ASCII码与整型数据进行运算。
以上都是系统自动完成。

例如:
给定一个大写字母,用小写字母输出;

在这里插入图片描述
通过查看ASCII表,同一个字母,小写字符的ASCII代码比大写字符的ASCII代码大32;

#include<stdio.h>
int main()
{
	char c1,c2;
	c1 = 'A';
	//单个字符用''表示,把'A'的ASCII代码放进c1变量中,65
	c2 = c1+32;//65+32=97,把97赋给变量c2,以二进制方式存储
	printf("%c\n",c2);//%c输出字符的格式
	printf("%d\n",c2);//%d输出十进制的格式
}
3.6强制类型转换运算符

格式: (类型名)(表达式)

例如:
(double)a (将az转化成dounle型)
(int)(x+y) (把x+y的结果转化成int 型)

在这里插入图片描述
float默认输出小数点后6位。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;