HQYJ嵌入式学习笔记——C语言复习day2
1.计算机的数值表示
数值类型和非数值类型
- 二进制 0,1 (0b1001)
- 八进制 0~7 (0146)
- 十进制 0~9
- 十六进制 0~f (0x3f)
八进制转二进制——>一位八进制数换三位二进制数。0124----->001 010 100
2.数据类型
数据类型作用:决定变量在内存空间占的内存大小
内存的基本单位:字节(byte)
内存的最小单位:比特(bit)
1 byte = 8 bit
基本数据类型:(32位系统OS)
- 整型家族
int (4 byte)
unsigned int : 0 ~2^32 - 1
[signed] int : -2^32 ~ 2^31 - 1
short (2 byte)
unsigned short : 0 ~ 2^16 - 1 0 ~ 65535
[signed] short : -2^15 ~ 2^15 - 1 -32768 ~ 32767
long (4 byte)
long long (8 byte)
- 浮点型家族
float (4 byte)
//有效数字 6 ~ 7位(四舍五入) float f = 1.2345678921;
double (8 byte)
//有效数字 15 ~ 16位(四舍五入)
字符型(属于整型家族,可以看成一个字节的int)
char (1 byte)
unsigned char : 0 ~ 255
[signed] char : -128 ~ 127
- 整型家族
构造数据类型 : 数组 ,函数,结构体,共用体,枚举
指针
void 空类型
- 通常在函数返回值还函数参数时候使用
- void *p;--------------->这个指针可以指向任意数据类型
- void num; //error,非法定义类型,报错
3.运算符
算数运算符
+ - * / %
int / int = int
double / int ---隐式转换成---> double / double = double
隐式转换:范围小的往范围大的转
char short -----> int
float -----> double
unsigned + signed ----> unsigned
强制转换
格式 : (数据类型)变量名
(数据类型) (表达式)(float)(a + b)
% 要注意运算符两边只能是整型数
逻辑运算符
逻辑表达式的结果只有两个值真和假 非0表示真 0表示假
&&
表达式1 && 表达式2 : 只要有一个表达式结果为假,整个表达式的结果就为假
只要表达式1的结果为假,所以表达式2不会再计算
int a = 5, b = 6;
int c = a++ > 5 && ++b > 6; //a=6 b=6 c=0
||
表达式1 || 表达式2 : 只要有一个表达式结果为真,整个表达式的结果就为真
只要表达式1的结果为真,那么整个逻辑表达式的结果就为真,所以表达式2也不会再计算
!
int a = 0;
if(a) //<====>if(a!=0) 表达式不成立 if(!a) 这个表达式成立
{
printf("*****\n");
}
位运算符(int)
& : 按位与
12 & 23 = 0000 1100 & 0001 0111 = 0000 0100 4
| : 按位或
12 | 23 = 0000 1100 | 0001 0111 = 0001 1111 31
~ : 按位取反
~ 12
^ :按位异或 相同为0 不同为真
12 ^ 23 = 0000 1100 ^ 0001 0111 = 0001 1011 27
<< : 左移
12 << 3 0000 1100 << 3 = 0110 0000 = 96
>> : 右移
12 >> 3 1100 >> 3 = 0001 (高位补符号位)
清零
1011100111 //将第6位清零 & ~(1<<6)
& 0111111 ~(1 << 6) 1000000
------------------
1010100111
将某一位或者某几位 置1
101111010011 //将第5位置1 |(1 << 5)
| 100000 (1 << 5)
---------------------
101111110011
1011000011
| 111000 (7 << 3)
---------------------
1011111011
关系运算符
> < >= <= == !=
赋值运算符
= += -= ++ --
++在前,先加1再取值;在后,先取值在加1
int a = 5; //a+=2; <===>a = a+2; &= |= ~=
int c = a++;
printf("%d,%d\n",a++,a); //5 6
printf("%d,%d\n",++a,a); //6 6
逗号运算符
计算规则:从左到右依次计算,取最后一个表达式的值作为逗号表达式的值
表达式1,表达式2,表达式3.....
int a = (12,14,16); // a = 16
条件运算符(三目运算符)
表达式1 ? 表达式2 : 表达式3
计算规则:先去判断表达式1是否为真,如果为真就执行表达式2否则执行表达式3
int a = 5,b = 10,c = 8;
a > b ? a : b //10
a>b ? a : a>c ? a :c //8
sizeof() : 计算内存大小
格式:sizeof(变量名) sizeof(数据类型)
float f; sizeof(f) sizeof(float)
() [] & *
4、结构性语句
顺序语句
printf()
scanf()
getchar() : 从键盘获取一个字符
char ch = getchar();
printf("ch = %c,ch = %d\n",ch,ch);
putchar() : 向显示屏输出一个字符
char ch = getchar();
putchar(ch);
gets() : 获取字符串
puts() : 输出字符串
选择语句
循环语句
5、算法
冒泡排序
选择排序
6、定义变量
格式:
存储类型修饰符 数据类型修饰符 数据类型 标识符
存储类型修饰符:
auto : 默认 , 一般修饰局部变量,放在栈区
static : 静态 , 会放在数据段
extern :外部声明 , 1.c定义的全局变量想要在2.c使用必须在2.c对这个变量做一个外部声明
register : 寄存器类型,如果被register修饰会看当前有没有可用寄存器,
如果有变量会被放在寄存器里面,如果没有,变量会自动转为auto
数据类型修饰符:
const : 将变量变成只读
标识符的定义:(程序员自己取的名字 普通变量名 数组名 指针名 函数名...)
(1)由数字 字母 下划线组成,不能以数字开头
(2)不能与关键字重名
(3)对大小写敏感 见名知意
int a; <====> auto signed int a;
常量 : 在程序运行过程中不能被更改的量
整型常量
99
0xff
066
浮点型常量
12.5
1.2e+5 1.2*10^5
2.34e-4 2.34*10^-4 0.000234
字符型常量
ASCII码表 带单引号才叫字符 a b 'a' 'b'
转义字符 '\n' '\t' '\b' '\bbb' 1 ~ 3 '\xbb' '\123' '\x12' "\123456" "\12fa"
字符串常量
7、输入输出函数
#include <stdio.h>
printf("格式控制串",输出表); ------> 按照指定格式将数据输出到屏幕上
输出表:要输出的数据 有多少个格式化符就有多少个要输出的数据
格式控制串: 原样输出的内容+格式化符
格式化符:
%d -----> 有符号的十进制数
%u------> 无符号的十进制数
%o------> 八进制数
%x------> 十六进制数
%f -----> 浮点型
%g -----> 指数形式
%c-----> 字符
%s-----> 字符串
%p -----> 地址
int a = 10000000;
printf("a=%d\n",a); a=10 //默认右对齐
printf("a=%5d\n",a); a=10000000 //由于指定的宽度5比数据的宽度要小,所以数据原样输出
prinrf("a=%10d\n",a); a= 10000000; //指定的宽度比数据宽度要大,用空格去补
int b = 0xaa;
printf("%d\n",b);
printf("%x\n",b); aa
printf("%#x\n",b); 0xaa //#是将进制数的前缀输出
float f = 12.5;
printf("f=%f\n",f); f=12.500000 //编译器默认小数输出6位
printf("f=%.2f\n",f); f=12.50
printf("f=%7.2f\n",f); f= 12.50
scanf("格式控制串",地址表);------>按照指定形式从键盘获取数据输入到指定地址
&+变量名 : 变量的首地址
格式控制串: ""里面除了格式化符,其他的内容原样输入
int a ;
scanf("%d",&a); 10
scanf("a=%d",&a); a=10
int a,b;
scanf("%d%d",&a,&b); 10 20
scanf("a=%d,b=%d",&a,&b); //在输入的时候只能按照a=10,b=20的格式进行输入
scanf("%d%d\n",&a,&b); //在输入的时候要用非空字符去结束输入
多个变量进行输入,要用分隔符(空字符) 空格 回车 Tab
float num;
scanf("%.2f",&num); //error 小数在输入的时候不能指定精度
char ch1,ch2;
scanf("%c%c",&ch1,&ch2); //如果用分隔符会将分隔符接收
scanf("%c%*c%c",&ch1,&ch2); //%*c会抑制掉一个字符
scanf("%c,%c",&ch1,&ch2); //指定格式输入
8、内存存储
整型数在内存里面存储的是补码
正数的原码 反码 补码都一样
负数的补码是反码+1
有符号数最高位是符号位,正数符号位是0 负数符号位是1
反码符号位不变,数据位改变
int a = 5;
0000 0000 0000 0000 0000 0000 0000 0101
int a = -5;
原码:1000 0000 0000 0000 0000 0000 0000 0101
反码:1111 1111 1111 1111 1111 1111 1111 1010
补码:1111 1111 1111 1111 1111 1111 1111 1011
printf("%d\n",a);
printf("%u\n",a);
char ch = 130; //-128 ~ 127
printf("%d\n",ch); //-126
原码: 1000 0010
1000 0010
1111 1101
1111 1110
0000 0000 0000 0000 0000 0000 1000 0010
char ch = -130;
printf("%d\n",ch); //126
原码:1000 0010
反码:0111 1101
补码:0111 1110
1000 0000 0000 0000 0000 0000 1000 0010
1111 .... 0111 1101
1111 .... 0111 1110
9、选择语句
HQYJ嵌入式学习笔记——C语言复习day2的更多相关文章
- HQYJ嵌入式学习笔记——C语言复习day1
第一天:Linux命令 vim操作 第二天:数据类型 运算符 顺序语句第三天:分支语句 循环语句第四天:循环语句 数组第五天:数组第六天:指针第七天:函数 数组与指针第八天:数组指针第九天:递归 第十 ...
- [java学习笔记]java语言核心----面向对象之this关键字
一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理: 代表的是当前对象. this就是所在函数 ...
- [java学习笔记]java语言核心----面向对象之构造函数
1.构造函数概念 特点: 函数名与类名相同 不用定义返回值类型 没有具体的返回值 作用: 给对象进行初始化 注意: 默认构造函数 多个构造函数是以重载出现的 一个类中如果 ...
- Java学习笔记:语言基础
Java学习笔记:语言基础 2014-1-31 最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...
- ARM9嵌入式学习笔记(1)-Linux命令
ARM9嵌入式学习笔记(1)-Linux命令 实验1-1-2 Linux常见命令使用 添加用户useradd smb; 设置账户密码passwd smb; 切换用户su - root 关机命令shut ...
- ARM9嵌入式学习笔记(2)-Vi使用
ARM9嵌入式学习笔记(2) 实验1-1-3 Vi使用 vi创建文件vi hello.c:vi smb.conf-打开文件smb.conf i键-插入模式:esc键-命令行模式::-底行模式: 底行模 ...
- IOS学习笔记07---C语言函数-printf函数
IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...
- IOS学习笔记06---C语言函数
IOS学习笔记06---C语言函数 -------------------------------------------- qq交流群:创梦技术交流群:251572072 ...
- mybatis学习笔记之基础复习(3)
mybatis学习笔记之基础复习(3) mybatis是什么? mybatis是一个持久层框架,mybatis是一个不完全的ORM框架.sql语句需要程序员自己编写, 但是mybatis也是有映射(输 ...
随机推荐
- 关于Spring Boot的博客集合
掘金: 关于Spring Boot的博客集合 CSDN: Spring Boot教程 掘金: SpringBoot2 简书: Spring Boot 核心技术 天码营 Spring Data JPA: ...
- 【有趣的全彩LED | 编程】用STM32 HAL库让WS2812B为你所动
一.效果展示 观看演示效果:https://www.bilibili.com/video/BV1dv411Y7x3 使用STM32 HAL库编程 PWM+DMA控制输出,CubeMX生成初始工程 实现 ...
- springboot注解开发
可以毫不夸张地说,这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的场景.对于每一个注解我都说了具体用法,掌握搞懂,使用 SpringBoot 来开发项 ...
- E - Period(KMP中next数组的运用)
一个带有 n 个字符的字符串 s ,要求找出 s 的前缀中具有循环结构的字符子串,也就是要输出具有循环结构的前缀的最后一个数下标与其对应最大循环次数.(次数要求至少为2) For each prefi ...
- CF662C Binary Table【FWT】
CF662C Binary Table 题意: 给出一个\(n\times m\)的\(01\)矩阵,每次可以反转一行或者一列,问经过若干次反转之后,最少有多少个\(1\) \(n\le 20, m\ ...
- (EX)中国剩余定理
中国剩余定理 问题引入: 有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何?<孙子算经> 就是计算一个数\(x\)满足\(\begin{cases} x≡2(MOD\ 3) ...
- 树链剖分(附带LCA和换根)——基于dfs序的树上优化
.... 有点懒: 需要先理解几个概念: 1. LCA 2. 线段树(熟练,要不代码能调一天) 3. 图论的基本知识(dfs序的性质) 这大概就好了: 定义: 1.重儿子:一个点所连点树size最大的 ...
- poj3087 Shuffle'm Up
Description A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuff ...
- HDU -1151 二分匹配与有向无环图不相交最小路径覆盖数
题意: 考虑一个小镇,那里的所有街道都是单向的,并且每条街道都从一个路口通往另一个路口.还众所周知,从一个十字路口开始,穿过城镇的街道,您将永远无法到达同一十字路口,即,城镇的街道没有环. 基于这些假 ...
- DNS 是什么?如何运作的?
前言 我们在上一篇说到,IP 地址的发明把我们纷乱复杂的网络设备整齐划一地统一在了同一个网络中. 但是类似于 192.168.1.0 这样的地址并不便于人类记忆,于是发明了 域名(Domain Nam ...