【关键字】 - 32个
1.数据类型 (12个)
int(4字节)、char(1字节)、float(4字节)、double(8字节)、long(4字节)、short(2字节)
基本数据类型:
数据类型:
整型数据:char(1字节=8位)、short、int、long
浮点数据:float、double
符号位:unsigned char a;(值域范围0~255)
signed、unsigned
构造数据类型:
struct、union、enum
特殊:void
2.存储类型 (4个)
auto、register、extern、static
3.控制语句 (12个)
顺序语句
选择分支
if……else……
switch……case……break、default、
循环语句
while、do、
for、break、continue;
goto
return
4.其它 (4个)
sizeof:计算数据了或者变量所占空间的大小;
const:修饰一个只读变量;
volatile:易变的,
typedef:取别名
【计算机数据表示形式】
机器本身而言:二进制数据(01序列);但是对人而言,分析起来比较麻烦;
人而言数据分析,十进制比较方便;但是十进制很难判断具体的哪一位是高位还是低位;
所以更多的时候采用八进制和十六进制的形式将计算数据展示给人来分析;
十进制数转二进制数:
整数部分: 除2取余;
小数部分: 乘2取整;
十进制数转八进制数:
整数部分: 除8取余
十进制转十六进制:
整数部分: 除16取余
十六进制:0x89 == > 1000 1001 === > 1*1 + 1*8 + 1*128 = 137;
十进制:137
八进制:0211
【数据类型】
数据所占空间的大小(字节为单位)
数据是否要考虑符号位(如果存在符号(占1个bit位,其余为数据位 --- > 值域); 不存在符号位:所有的位均为数据位);
1. bool类型:
值域:ture、false
作用:一般情况用来表示处理结果成功或者失败;
注意:在bool类型的时候,需要添加头文件stdbool.h(bool类型、true、false的定义);
2. 整型数据:(在讨论的是都是按照32位系统分析)
char类型:
所占空间的大小:1个字节(byte), 8bit(位)
值域:
有符号char:符号1位,数据位7位;
符号位为0,表示大等于0的char数据: 0 - 127;
符号位为1,表示的小0的char数据; -128 - -1;
值域:-128 - 127;
signed char c = 128;
无符号char: 数据位8位;
值域:0 - 255;
使用注意:数据不要超过值域范围;
short类型:
所占空间大小:2个字节
值域:
有符号short:符号位1位,数据位15位:
值域:-32768 - 32767;
无符号short:数据位16位
值域:0 - 65535
int类型:
所占空间大小:4个字节
值域:
有符号int:符号位1位,数据位31位;
值域:
无符号int:数据位32位
值域:
long类型:
所占空间大小:4个字节
值域:
有符号long:符号位1位,数据位31位;
值域:
无符号long:数据位32位
值域:
long long类型:
所占空间大小:8个字节
3454563.124235;
= 0.3454563124235 * 10^7
指数 + 尾数
3. 浮点型数据:
float类型:
所占空间大小:4个字节;
值域:
有符号float:符号位1位,数据位31位
1位存储符号位 + 8位存储指数部分 + 23位存储尾数部分;
值域:
无符号float:数据位32位
8位存储指数部分 + 24位存储尾数部分
存在的问题:
当你存储一个小数的时候,尾数部分所需要的存储空间比尾数实际可用空间要大,
将部分位存储,所以取出的数据可能和实际的数据不相同;所以判断两个浮点数是否相等,
不能直接通过“==”符号来进行比较;
问题:如何判断float类型变量f的值是否为0;
if(f >= -0.000001 && f <= 0.000001) {
printf("f的值为0");
} else {
printf("f的值不为0\n");
}
double类型:
所占空间大小:8个字节;
值域:
有符号float:符号位1位,数据位31位
1位存储符号位 + 11位存储指数部分 + 52位存储尾数部分;
值域:
无符号float:数据位32位
11位存储指数部分 + 53位存储尾数部分
对于任意的基本数据类型:
关心:
所占空间大小sizeof(数据类型);
值域:根据存储方式计算:
【常量】
定义:数据不会发生改变的量,叫做常量
常量类型:字符常量、整型常量、浮点型常量、字符串常量、标识符常量:
整型常量:数值型常量,它的表现形式:十进制数据、八进制数据和十六进制数据;
例如: 3356 /*十进制*/
06434 /*八进制*/
0xD1C /*十六进制*/
字符常量:特殊的符号或者字符,它的表现形式:'a'、97、'\n'
浮点型常量:描述一个浮点型数据
它的表现形式:
小数形式:[+|-]M.N //[+|-]:浮点型数据的符号;M:浮点型数据的整数部分;N浮点型数据的小数部分;
例如:3.1415926
指数形式: [+|-]M.N<E|e>[+|-]T
指数形式表示浮点型数据的优势:可以用来描述很大或者很小的数据;
字符串常量:它的表现形式:"hello"、 "a\0";
标识符常量:通过一个特殊的符号来描述常量的值,
定义标识符要满足标识符的命名规则,最好做到见名知意的效果;
为了普通标识符的区别,用大写的方式;
具体的定义方式:
#define 标识符名称 常量值
例如:
#define ONE 1
#define TWO ONE+ONE
#define STR "hello"
#define DEBUG printf("%s - %s - %d\n", __FILE__, __func__, __LINE__)
【变量】
可以改变的量,叫做变量;
变量的定义:
存储类型 数据类型 变量名
变量名:满足标识符的命名规则;
数据类型:可以基本数据类型,也可以后面所要讲到的构造数据类型
存储类型:auto、register、exter、static中的一个;
定义一个变量,可以是全局变量也可以是句变量:
如果是全局变量:则可以在整个程序中的任意位置进行访问;
在定义一个全局变量,程序编译的时候生效,依然在程序运行的时候开辟空间;也就是变量的地址不会改变;
如果在定义的时候没有给初始值,系统访问到变量的值为0;
如果是局部变量:只可以在所定义的函数或者模块内部进行访问;
在定义一个局部变量的时候,如果没有给初始值,系统会默认给变量一个随机值;
对于局部变量:程序在运行的时候会去内存里面开辟一片空间,也就是说前后两次运行所开辟的空间不再同一个位置;
默认的值也就不同;
如果给了初始值,系统访问的就是所给的值;有两种方式:1.定义的时候初始化,2.先定义在初始化;
存储类型关键字:
auto:所有为被特殊说明的局部变量都是auto类型;默认的时候可以省略;并且只能用来修饰局部变量;也就是说用auto修饰的变量存储在栈空间。
register:寄存器变量
寄存器的特点:运行速度快、数量少;也就是说在定义为寄存器变量的数量是有限的。 register只能用来修饰局部变量;
如果要申请多个register变量,超过寄存器最大值的时候,申请寄存器变量会失败,此时变量会转换为auto类型。
register变量不会在内存中开辟空存储,只会存储在寄存器当中,不能取得该register变量的地址;
extern: 外部申明引用
将程序中其他文件中变量引用过来使用;
static:修饰静态存储变量
1、static修饰全局变量
改变了变量的作用域,未被static修饰的全局变量在程序的任意位置都可以访问,但是被static修饰之后,只能在所定义变量的文件访问。
2、static修饰局部变量
改变了变量的存储位置和生命周期;未被static修饰的局部变量存储位置在栈区、生命周期是程序运行到模块结束;
被static修饰的局部变量存储位置在静态存储区、生命周期是程序运行到程序结束。
变量的定义:
一般形式:存储类型 数据类型 变量名
变量定义的同时初始化:
一般形式:存储类型 数据类型 变量名=表达式
【数据类型的强制转换】
强制数据类型的转换是指采用某种方式将某种数据类型强制转换成指定的数据类型;
int a =23.45;
转换的方式:
1、隐士转换;一般系统自己完成,为了最大程度的保存数据的完整性
2、显式转换:
转换形式:(数据类型)表达式:
注意:1)如果要转换的表达式比较复杂,用括号包含在一起;
2)强制转换时不安全;
3)强制转换,不会修改内存的值;
默认的转换规则:
char -> short ->int ->long -> double <- float
unsigned ->signed