目录
c语言定义不同的数据类型目的:合理的利用内存空间;
计算机采用二进制输入,内部只识别0 1,一个位只能是0 or 1
1B字节=8b位,(范围00000000~11111111)
1B=8b,1KB=1024B,1MB=1024KB;1GB=1024MB,1TB=1024GB
一:关键词
1.数据型关键字:
char short int long float double unsigned signed struct union enum void
2.控制语句关键字:
if else switch case default for do while break continue goto return
3. 存储类关键字:
auto自动类型 extern外部可用 register寄存器变量 static静态变量 const只读变量
4. 其他
sizeof测类型大小 typedef为已有类型重新取一个别名 volatile防止编译器优化
二:数据类型:
-
在32位的平台中
char :字符类型。占1字节的空间,8位
short:短整型。占2字节的空间,16位
int :整型。占4字节的空间,32位
long:长整型。占4字节的空间,32位
float:浮点型。占4字节的空间,32位
double:双精度浮点型。占8字节的空间,64位
sizeof() 计算每一个数据类型的长度;
- 在64位的平台中
char :字符类型。占1字节的空间,8位
short:短整型。占2字节的空间,16位
int :整型。占4字节的空间,32位
long:长整型。占8字节的空间,32位
float:浮点型。占4字节的空间,32位
double:双精度浮点型。占8字节的空间,64位
sizeof() 计算每一个数据类型的长度;
eg:验证每一个类型的长度,
2. unsigned 和 signed
1.无符号数:unsigned
数据没有符号位,自身的所有二进制位 都是数据位
如:unsigned char 0000 0000~1111 1111
2.有符号数:signed 默认一般省略
二进制的最高位是符号位,其他位都是数据位
signed char 0xxx xxxx 最高位0为正,1为负 如:-10==1000 1010
范围 1111 1111 ~ 0111 1111
eg: 输入代码
#include<stdio.h>
int main(int argc,char *argv[])
{
//计算机编程中,默认是带符号的数据
//signed 可以省略不写(默认输入)
sigend int num1=10;
int num2=10;
//但无符号数申明时,一定要写明unsigned
unsigned int num3=11;
return 0;
}
3.其他关键词
1.结构体 struct :结构体的成员拥有独立的空间;
struct data1{
char a;
short b;
int c;
}
a b c 就是结构体data1的成员,各自拥有独立的空间;
2.共用体union:共用体中的成员共享同一份空间;
union data1{
char a;
short b;
int c;
}
a b c 共享同一块空间;
3. enum枚举: 将变量要赋值的值一 一 列举出来
enum BOOL{false,true};
enum BOOL bool=false;
4.void 无类型:不能用void定义变量
int num; // 正确的定义
void num; // 错误的定义,系统无法定义给void定义的num开辟多大的空间
5. register寄存器变量:
当放入内存的变量被频繁的使用时,计算机会将此变量放入寄存器中,从CPU的寄存器读取数据比从内存读取要快很多;
register int num; //当定义一个变量时,如果预先知道要频繁使用,就尽量将此变量放入寄存器中;
总结:
1.如果没显示标明register,就类似int num ;如果num 被高频繁使用,系统也会自动放入寄存器中
2.register int num; //显示将num放入寄存器中;
3.寄存器的变量C语言中不能取地址,而c++可以;
#include<stdio.h>
int main(int argc,char *argv[])
{
register int num=10;
// %p输出地址
printf("%p/n",&num);
//c++语言可以将地址操作符用于寄存器变量,而c语言会报错。
return 0;
}
6. typedef : 为已有的类型取个别名
eg:代码演示
#include<stdio.h>
typedef int INT32; //给已有的变量 int取一个别名叫 INT32;
void test01() //定义一个无类型的变量作为结果输出;
{
int num1=10;
INT32 num2=20; //int 与 INT32 等价
printf("num1=%d\n",num1); // 结果是num1=10
printf("num2=%d\n",num2); // 结果是num2=20
}
int main(int argc,char *argv[]) // int main 定义一个整型结果输出
{
test01();
return 0;
}
7. volatile: 防止高频繁的变量编译器优化放入寄存器中,强制CPU每次访问内存操作;与 register恰好相反;
不允许将volatile的变量放入寄存器,只能放在内存中;
要实时监测变量的变化,而不是放入最开始的值到寄存器,内存变量发生变化后,而寄存器还是最开始的值;