c语言中共有关键字32个,了解即可之后也会讲到,并且在之后使用过程中会越来越熟练
一、存储单位
计算机存储的是二进制,一位二进制能存放0或1(表示关或开,低电平和高电平)
1字节=8bit(也就是8位二进制位)0000 0000~1111 1111
1B=8b
1KB=1024B
1MB=1024KB
1GB=1024MB
1TB=1024GB
1PB=1024TB
1EB=1024PB
........
(10.24是程序员节哦!!)
二、关键字
1.数值类型(12个)
数据的不同类型是为了合理利用空间
1)在32位平台:
char字符型:1字节(8位)
short短整型:2字节(16位)
int整型:4字节(32位)
long长整型:4字节(32位)
longlong长长整型:8字节(64位)但是这个有的开发环境有有的没有(vc++6.0,vs2010中不能用)
float单精度浮点型:4字节(32位)
double双精度浮点型:8字节(64位)
2)在64位平台
只有long是8字节(64位)发生变化
3)可以用sizeof测量类型的长度
#include<stdio.h>
int main(int argc,char *argv[]){
printf("sizeof(char) = %d\n",sizeof(char));
printf("sizeof(short) = %d\n",sizeof(short));
printf("sizeof(int) = %d\n",sizeof(int));
printf("sizeof(long) = %d\n",sizeof(long));
printf("sizeof(float) = %d\n",sizeof(float));
printf("sizeof(double) = %d\n",sizeof(double));
while(1);
return 0;
}
运行结果:
4)unsigned与signed
unsigned无符号数:
数据没有符号位,全是数值
unsigned char a;1字节就是0000 0000~1111 1111
signed有符号数:
默认就是有符号,可以省略
二进制最高位是符号位,其余为数值位 ?signed char a;1字节就是xxxx xxxx(x表示0~1)
signed char a;1字节就是xxxx xxxx(x表示0~1)
?最高位为1表示负数(1xxx xxxx)最高位为0表示正数(0xxx xxxx)
?范围:1111 1111~1000 0000~0000 0000~0111 1111
?char型的-10改为二进制为1000 1010(现阶段可以win+R写calc调出程序员计算机进行计算,之后会讲到如何进行换算)
#include<stdio.h>
int main(int argc,char *argv[]){
signed int num1 = 10;//有符号数
int num2 = 10;//虽然没写signed,但是默认有符号
unsigned int num3 = 10;//无符号数
while(1);
return 0;
}
这个代码没有输出哦
5)struct与union
?struct是结构体,其中成员拥有独立空间
struct data1{
char a;
short b:
int c;
};
示意图大体是这样,但是这并不是详细的存储结构,只做示意
union是共用体,其中成员共用一份空间
union data2{
char a;
short b:
int c;
};
6)enum
枚举类型,将变量一一列出
c语言没有布尔值
可以自己造一个:
#include<stdio.h>
int main(int argc,char *argv[]){
enum BOOL{false,true};
//这个地方false和true标红是因为这里实质上使用的是c++
//而c++中是存在布尔类型的也就是bool以及false和true都是它的关键字
enum BOOL bool = false;
//这个bool也会报错,从下方bool的报错中就可以看出bool实质是已有的类型名
printf("bool=%d",bool);//这个地方由于是false所以是0
while(1);
return 0;
}
报错:
原因上面代码中解释了
7)void
无类型,就字面意思
注意不能用void定义变量
因为系统根据变量前的数据类型来申请空间,无类型这样系统不知道要申请多少空间就会报错
2.控制语句(12个)
if,else,switch,case,default(选择)
for,do,while,break,continue,goto,return(循环)
3.存储类关键字(5个)
auto自动:在c中不咋用,Java中可以根据赋值自动推测数据类型
const只读变量,entern外部可用,static静态,
register寄存器:
当一个在内存中的数据使用得非常频繁,系统会自动将它放到寄存器中,从寄存器中读取数据的速度比内存中快得多
使用register可以人为的要求系统尽量将某个数据放到寄存器中,但是如果寄存器满了,那也还是放不进去
当然,内存和cpu之间也是有各级缓存的,图中没有表示出来
register int data=10;//人为的尽量将data放入寄存器中
printf("%p\n",&data);//不对,不能对寄存器变量取地址
系统将数据从内存中拿到寄存器中,我们通常说的取地址是取内存地址
%p是地址的输出占位符
4.其他(3个)
sizeof测量类型大小
typedef为已有类型取别名:便于代码的移植
#include<stdio.h>
typedef int INT32;
int main(int argc,char *argv[]){
int num1 = 10;
INT32 num2 = 20;
printf("num1 = %d\n",num1);
printf("num2 = %d\n",num2);
while(1);
return 0;
}
运行结果:
volatile防止编译器优化,强制访问内存操作:
适用于要时刻访问的数据(底层驱动会大量用到这个关键字)
volatile int value;
比如说监测有毒气体,这个设备会实时监测数据,data也就经常使用,就前面所说的,如此频繁使用,系统就会将data放入寄存器中,每次取数值都从寄存器中取,但是data可是实时变化的
假如我把data拿到寄存器中的时候有害气体是10%非常安全,在很短的时间内,data有害气体变成了90%,然而你寄存器中还是之前的10%,就会导致大问题发生
?
?
?
?