嵌入式学习day2
一.数据类型
生活中有很多数据类型整数、小数、字符、汉字【字符串】,计算机需要存储这些数据,那么就会引出数据类型,每一种数据都会有特定的数据类型进行存储,作用方便同一操作,节省空间,方便查找等。
1数据类型的分类
类型 | 解释 |
---|---|
基本类型/原子类型 | 不可分割【int float char double 等】 |
构造类型 | 可以分割【数组、结构体struct、共用体union】 |
空类型 | void,空类型并非没有类型,类型是空,一般使用在参数和返回 |
指针类型 |
2 基本数据类型
> 整形数据类型
类型 | 存储大小 | 输出字符 | 值范围 |
---|---|---|---|
int / signed int | 占有4字节 | %i %d | -2^31 ---- 2^31-1 |
unsigned int | 占有4个字节 | %u | 0 ---- 2^32-1 |
short | 占有2个字节 | %d | -2^15 ----2^15-1 |
unsigned short | 占有2个字节 | %d | 0 -----2^16-1 |
long | 占有8个字节 | %ld | -2^63 -----2^63-1 |
unsigned long | 占有8个字节 | %ld | 0 ------2^64-1 |
>浮点型/实数/小数
类型 | 存储大小 | 输出字符 | 值范围 |
---|---|---|---|
float单精度浮点型 | %f | 占有4个字节 | 默认有6个小数点有效位7位 |
double双精度浮点型 | %lf | 占有8个字节 | 默认有6个小数点有效位16位 |
>字符类型
类型 | 存储大小 | 输出字符 | 值范围 |
---|---|---|---|
char | 占有1个字节 | %c | -2^7 ---- 2^7-1 |
unsigned char | 占有1个字节 | %d | 0----2^8-1 |
注意:当定义数据类型时,默认是有符号数 |
3 常量
3.1整形常量 小数常量
类型 | 解释 |
---|---|
整型 | 1 0 -100 |
小数常量 | 3.14 -3.2 等 |
3.2字符常量
- 字符常量需要使用单引号括起来,例如’a’ ‘b’ , ‘0’ ‘!’ ’ ’
- ‘\n’ 换行
- ‘\t’ 制表符,tab键
- ‘\0’ 表示空字符
- ‘a’: 97
- ‘A’:65
- ‘0’:48
- 大写转换小写:+32 +(‘a’-‘A’)
- 小写转换为大写:-32 -(‘a’-‘A’)
- ‘0’ —>0 数字转换: -48 / -‘0’
3.3 宏定义[常量]
格式:#define 宏名 字符串
重点:宏不做计算,只做替换,不做正确性检查
- #define : 宏定义
- 宏名: 满足命名规范【由数字、字母、下划线组成,不能是关键字,不能以数字开头,见名知意,一般大写】
- 宏不是C语句,不需要加分号
- 常量的值不可以发生改变
1> #deifne M 100 M的值是 100
2> #define M =100 M的值字符串是 =100
3> **在定义宏是字符串可以省略不写**
例如:
#deifne P 100 //把100的值赋值给P
#define M "aaa" //双引号括起来的成为字符串,可以写多个字符
#define N a //把变量的值赋值给一个常量
#define K 'w' //单引号括起来的成为单字符,'w'常亮
int main(int argc, const char *argv[])
{
int a = 100;
a = 200;
printf("N=%d\n", N); // 此处输出N=200
printf("K=%c\n", K); // 此处输出K=w
printf("M=%s\n", M); // 此时输出M=aaa
printf("P=%d\n", P); // 此处输出P=100
}
练习1:
#include "stdio.h"
#define A 5+5
void main()
{
printf(""%d"",A*2); 5+5*2
}
练习2:
//当除号两端都是整数时,最终结果也是整数
//宏不做计算,只做替换,不做正确性检查
3/2=1
3.0/2=1.5
#include<stdio.h>
#define N 4+1
#define M N*2+N
#define RE 5*M+M*N
main()
{
printf(""%d"",RE/2);
}
N=4+1 M=4+1*2+4+1
5*4+1*2+4+1+4+1*2+4+1*4+1/2
4变量
变量:数据可以修改,存储数据的容器
格式:存储类型 数据类型 变量名;
1> 存储类型:
类型 | 解释 |
---|---|
auto | 自动类型,一般默认不写的就是自动类型 |
static | 静态类型,存储在静态区,延长生命周期 |
const | 修饰词,表示变量的值不可修改 |
register | 访问速度快 |
extern | 外部变量 |
volatile | 防止内存优化 |
2>数据类型:
- 基本类型【int float char double short】
- 构造类型【struct,union】
3>变量名:满足命名规范
4.1 短整形变量
注意:
1.当有符号数和无符号数进行运算时,最终结果是无符号数
2.当数据越界时,会循环到最小值,或者从最大值开始
short q=1,w=2,e=3,r=4;//定义多个变量
short a=-32769; //定义一个变量
short int b=1;//默认是有符号数
printf("a=%d\n",a);
unsigned short c=65536;
printf("c=%d",c);
4.2> 整型int
- 格式控制符%d
- 定义多个变量 int a,b,c,d;
- 当数据越界时,会循环到最小值,或者从最大值开始
- 当有符号数和无符号数进行运算时,最终结果是无符号数
4.3> 长整型long
- long等价于long int.
long a=10; long int b=100; - 格式控制符%ld
- 定义多个变量 long a,b,c,d;
- 当数据越界时,会循环到最小值,或者从最大值开始
4.4 浮点型/实型/小数
- float格式控制符%f double格式控制符%lf
- 默认输出哟6个小数点
- 确定精度直接加".2f"表示确定2个小数点
float a=1.2;
double b=1.36;
printf("a=%f\tb=%lf\n",a,b);
printf("a=%.2f\tb=%.3lf\n",a,b);
4.5 字符类型变量
当单字符%c输出是,输出的是字符,%d输出,输出的是ASCII
char a=97,b='1',c=1,d; //定义多个变量
char a=97;
printf("a=%c a=%d\n",a,a);
char b='A';
printf("b=%c b=%d\n",b+32,b+32);
4.6 类型转换
4.6.1 自动转换
低字节转换为高字节类型,称为自动转换
char —>short int long float double
short —>int long float double
int --> long float double
long —>double
float ---->double
一般小数类型的数据,最终以double类型进行计算
4.6.2强制类型转换
高字节转换为低字节类型,称为强制转换
double ----》 float int short char long
float ----》 int short char
int ----》 short char
short----》char
int main(int argc, const char *argv[])
{
char a=10;
float b=12.55;
printf("b=%f",b);
printf("%d",(int)b);//把b强转为int类型
(int)a+b; //对a进行强转
(int)(a+b) //对a+b整个结果进行强转
(int)(a+b)/2 //对a+b整个结果进行强转,和/2没有关系
return 0;
}
4.6.3有符号数和无符号数之间的转换
1.int类型的有无符号数的转换 :默认把有符号数转换为无符号数
2.short/char类型的有无符号数的转换,自动转换为int类型进行操作
3.unsigned不可以修饰浮点型
二、输入输出IO函数
1.输出printf
*格式:int printf(const char format, …);
- printf: 库函数,直接使用
- 在#include <stdio.h>这个头文件,必须引入头文件,不引入警告
- int: 返回值,表示输出字符的个数
- const char *format : 表示输入的格式不可以修改
- … : 选项列表,可以使多个,多个选项列表之间使用逗号隔开。
除了格式串以外都要使用英文
printf("hello"); // 直接输出
//输出一个或多个数字
int a=100;
float b=10;
char c=13;
double d=9.55;
printf("a=%d\nb=%f\nc=%c\nd=%lf\n" ,a,b,c,d);
- 格式控制符要和输出参数格式保持一致,否则警告,并输出乱码
2.scanf输入
格式:int scanf(const char *format, …);
- 头文件 #include <stdio.h>这个头文件,必须引入头文件,不引入警告
- int : 返回值,表示输入数值的个数
- scanf: 输入库函数
- const char *format: 表示输入的格式串不可以修改
- …: 表示输入地址列表,注意多个地址列表之间使用逗号隔开
- 除了格式串以外都要使用英文
- scanf以空格,回车,tab键表示输入结束,回车表示整个输入结束
//输入单个
int a,b,c;
printf("请输入a的值:");
scanf("%d",&a);
//输入多个
printf("请输入b和c的值:");
scanf("%d%d",&b,&c);
printf("a=%d b=%d c=%d\n",a,b,c);
*输入字符:需要吸收垃圾字符,方法:%c抑制字符 空格 getchar(),均可以吸收垃圾字符
char a,b,c;
printf("输入三个字符:");
//scanf("%c %c %c",&a,&b,&c);
scanf("%c",&a);
getchar();
scanf("%c",&b);
getchar();
scanf("%c",&c);
// scanf(" %c",&b);
// scanf(" %c",&c);
// scanf("%*c%c",&b);
// scanf("%*c%c",&c);
printf("a=%c,b=%c,c=%c\n",a,b,c);
3 getchar输入单字符
作用:专门用来输入单字符,吸收垃圾字符
格式:int getchar(void);
- 头文件#include <stdio.h>
- int: 表示键盘输入字符的ASCII值
- getchar: 单字符输入函数
- void: 空类型,空参数
- 一次只可以输入一个单字符
4 putchar 输出单字符
格式: int putchar(int c);
- 头文件#include <stdio.h>
- int: 返回输出单字符的ASCII值
- putchar: 输出单字符的函数
- int c: 输出的字符变量名
- putchar一次只能输出一个
int main(int argc, const char *argv[])
{
char a,b,c;
printf("输入第一个字符:");
a=getchar();
printf("a=%c a=%d\n",a,a);
printf("输入第二个字符:");
getchar();
b=getchar();
printf("b=%c b=%d\n",b,b);
printf("输入第三个字符:");
getchar();
c=getchar();
printf("c=%c c=%d\n",c,c);
printf("a=");
int num=putchar(a);
printf("num=%d\n",num);
putchar(b);
putchar(c);
//输出一个常量
putchar('K');
return 0;
}
5 scanf和getchr之间的区别
- scanf可以输入任意类型,getcahr只可以输入字符
- scanf一次可以输入多个,getchar一次只能输入一个
- scanf需要解析格式串,getcahr直接读取键盘输入的值
scanf速度慢,getcahr速度快 - scanf以空格,tab、回车结束输入,getcahr只能是回车
6 printf和putchar之间的区别
- printf可以输出任意类型,putcahr只可以输出字符
- printf一次可以输出多个,putchar一次只能输出一个
- printf需要解析格式串,putcahr直接输出
printf速度慢,putcahr速度快
作业
1.输入秒数,输出时 分 秒
#include <stdio.h>
int main(
{
int time, h, m, s;
printf("请输入秒数");
scanf("%d", &time);
h = time / 3600;
m = time % 3600/ 60;
s = time % 60;
printf("%d小时%d分钟%d秒");
return 0;
}
2.输入三个数,不借助第三方变量,实现互换
#include <stdio.h>
int main()
{
int a=1,b=2,c=3;
a=a+b+c;
b=a-b-c; //此时 a=6,b=1,c=3
c=a-b-c; //此时 a=6,b=1,c=2
a=a-b-c; //此时 a=3,b=1,c=2
printf("此时a=%d b=%d c=%d",a,b,c);
return 0;
}
3.输入三位数,输出百位 十位 个位
#include <stdio.h>
int main()
{
int a,b,c,d;
printf("请输入三位数");
scanf("%d",&a);
b=a/100;
c=a%100/10;
d=a%10;
printf("千位=%d百位=%d十位=%d和为%d",b,c,d,b+c+d);
return 0;
}
4.输入一个数,输出向上取整和向下取整
#include <stdio.h>
int main()
{
float a;
printf("请输入一个实数\n");
scanf("%f", &a);
printf("向上取整的数为%d", (int)a + 1);
printf("向下取整的数为%d", (int)a );
return 0;
}