常量
常量是值在程序运算中不变的量,常量经常出现在程序中,如123、3.14159、‘a’、"computer",此时只要求它们符合相应类型数据的表示方法。相应于各种数据类型,有整型常量、浮点型常量、字符型常量及zi字符串常量。
常量定义是指定义符号常量,用一个标识符来代表一个常量,通过宏定义预处理指令来实现。 格式:#define 标识符常量 由用户命名的标识符是符号常量名。作为符号常量名,一般大写。一旦定义,在程序中凡是出现常量的地方均可用符号常量名来代替。 对使用了符号常量的程序在编译前会以实际常量替代符号常量。
例:#define PI 3.14
变量
变量是指,在程序运算中,可以被重新赋值,变化的量。
变量的数据类型
基本数据类型关键字: int,short,long,float,double,char,unsinged,signed,_Bool,_Complex,_imaginary
long short unsigned,signed为基本类型提供变种,修饰基本类型。
按照存储方式,被分外两个系列
1.整数类型的存储
整数以二进制方式存储在内存,比如在一个32位操作系统中,int占4个字节,我们定义一个int a = 3;则计算机为该变量分配4*8=32个位子 00000000 00000000 00000000 00000011
2.浮点数类型的存储
浮点数与整数的唯一区别是,带有小数点,比如7是整数,7.0是浮点数。
3.16E7 表示3.16 * 10的7次方,但实际的存储方式如下图,当然存储的不是10进制数据,下图只是为了方便查看
右边只存储指数,小数部分全部由中间部分存储
整数类型
short,long,unsigned,signed 是对int 整数类型的取值范围修饰符,其中short int,long int ,long long int分别可以缩写成 short 和long和long long
unsigned 修饰为非负类型,增加类型的正数取值范围,signed修饰为有符号,一般默认不写unsigned 即使signed 有符号的,写只是为了明确这一属性。
int 的取值范围根据各个操作系统取值范围是不一样的,比如在一个16位的操作系统中,int 占 16 位即 2个字节,-32768 ~32767 而在32位操作系统中要多一倍。
不管是在任何平台上,但是C语言标准规定,int 最少要有16位,short肯定是比int 要小,long最小要有32位长,long long 最少要有64位长。
八进制和十六进制的表示方法:
int a,b; a = 0x11; //表示10进制的17 0x也可以大写0X b = 021; //表示10精致的17 printf("%#x\n%#o",a,b); //打印,分别用%x和%o来打印16进制和8进制,%d转换为10进制了再打印。'#'号表示打印进制前缀
C语言对于整数常量默认为int形,当超过int的取值范围,编译器会自动识为long int ,如果大于long int 为自动识为unsigned long int 。。。unsigned long long int
八进制和十六进制也是被视为int
有时候需要把一个较小的常量希望用计算机不默认为int 存储,这时候我们可以再常量后面加上标示符,比如
21L,35l,85LL,02U
字符类型
char类型用于存储符号,字母,之类的数据,但是在技术上char确实整数类型,因此聪明的人定制了ASCII标准,每个标点符号,字母,字符形式数子,都对于一个整数进行存储,然后呈现出来的时候再进行转换为对于的字符,然后,这些字符,虽说能够满足一些英国,美国人的需要,但是并没有中文字符与数字对应的标准,因此也产生了,gb2312,gbk等编码规则,然后各个国家有各个国家的编码规则,之后unicode的产生可以容纳所有国家的编码。
char 一般占一个字节,既可以表示2的8次方个数
C允许使用signed,unsigned来修饰字符类型变量,标明字符符号性质,默认为有符号的,对于unsigned char 处理小整数十分有用
字符变量的定义
char a = 'c'; //注意是单引号,表示c是一个常量,""表示字符串, //当然你可以直接使用整数常量对一个char 赋值,因为char 存储方式和整形完全一样,只是拿出来会转换为相应的字符。但C语言不建议你这么做,因为不直观。 char b = 099;
C语言将字符常量默认为int 而非字符类型
转义字符
对于某些非打印的字符,比如说我们希望有一个蜂鸣,或者是一个退格的输出,我该怎么输入给程序,C语言为我们提供了两种方式,
1.因为char 的实现就是int ,所以根据ascii码表我们直接找到蜂鸣所对应的的整数编号是7,当然你也可以用其他进制来给一个字符变量赋值。
char a;
a = 0x7; //十六进制方式
a = 07; //八进制方式
a = 7; //十进制方式
2.可以使用转义序列
C语言为我们提供了一些特殊的表示法来与不能打印的字符做一个对应关系,这就是我们常称的转义字符,如下表
这里需要记住几个常用的转义字符,\n换行 \r 回车\t 制表符
转义字符的赋值方式
char a; a = '\n'; //转义字符 a= '\010'; //这个也是转义字符,只是,以ascii对应的ascii值以八进制字符方式赋值,这个和直接与前面讲到的以整数方式赋值,虽然说达到的目的一样,但其实际意义不同。此为转义序列。 a = '\x010'; //x后面的0可以省略,前面的八进制的0也可以省略,注意,转义序列中16进制转义字符,和整数不同,不是0x而是直接x开头,被C90后才支持此种方式
字符的打印
int a = 'a'; priintf("%c",a) //%c,告诉printf函数,按照输出的是数字对应的ascii符,而不是整数,要输出整数,%d,会把a 直接输出为整数,而不是字符,因为存储也是存的整数
_Bool 类型
此类型仅适用于C99标准,占1位,相对于int的 1和0,更能节省存储空间,标明两种状态true,false。
浮点类型
浮点类型,指带小数点的小数,包括两个关键字,float,double,其中 不能用signed,unsigned来修饰浮点数,因为前面讲到的浮点数的存储方式中,有专门的符号位来标示,所以这两个修饰词,不是像整数那样的存储,并且 long float 这种形式在C89后就被替换成double,不建议使用。long double 是可以的
float 一般同int 一样,占4个字节。32位,double 占64位,并且C语言规定,float至少能表示6位有效数字,double至少能表示10位有效数字
默认情况C语言把浮点常量作为double类型
浮点类型的声明与定义
float f; double d; f = 215.12; //小数表示 d = 2.15E2; //指数形式表示 e或E都行,2表示10的2次方 //下面是正确的浮点常量 3.1415926 .2 //可以省略前面的整数 3. //可以省略后面的小数,但要有点 .3E12
2.36f //由于浮点默认是double,可以加后缀f或F来表示是一个float类型
35.F
54L //L或l表示是double
sizeof 求类型占几个字节
int a = 234; printf("%u",sizeof(int)); printf("%u",sizeof(a)); //也可以是变量 printf("%u",sizeof(char)); printf("%u",sizeof(double));