3.6 常量
常量,顾名思义就是在程序执行期间不会改变的固定值。在C语言中,常量的主要作用有两个,其一为给变量赋值,其二为与变量比较,作为判断条件。
在C语言程序中的常量有四大类,分别是整数型常量,浮点数常量,字符型常量和字符串常量,本节先来介绍前三种,字符串常量等讲述字符串的时候再介绍。
整数型常量,可以是二进制,八进制,十进制,十六进制的有符号数或者无符号数,这些数值在程序中无法单独出现,一旦出现,必定在程序语句中执行对变量赋值操作或者执行条件比较。
首先,常量也是有符号的,这个可能之前的书里面没有特意指出,但是在规范的C语言编程里面,当我们给一个变量赋值时,一定要注意这个值的符号。常量的符号,在程序中用加在常量数值结尾的后缀表示,如果赋值的常量是个有符号数,即给有符号的变量赋值,我们不需要加用以表示符号的后缀。但是如果赋值的变量是个无符号数,我们必须要指出这个常量也是个无符号常量(尽管不指出也不会有任何影响,但是某些静态语法解析工具会抛出警告),在一个常量的结尾加上后缀“U”表示此数值是个无符号的数。比如定义一个无符号变量UIntg,并给它赋值无符号类型的整数1000,即可写成:
unsigned int UIntg = 1000U;
如果此时定义了一个有符号的整数Intg,并给它赋值有符号类型的整数1000,那么可以写成:
int Intg = 1000;
其次,常量可以是任意进制的,C语言中,在变量开头前加上一个前缀来表示这个常量的进制,如果是十进制的就不需要加。
一个常量前面加0b就表示这个常量是个二进制常量,如0x10100001;
一个常量前面加数字0就表示这个常量是个八进制常量,如0777;
一个常量前面不加任何前缀就表示这个常量是十进制,如1000;
一个常量前面加0x就表示这个常量是个十六进制常量,如0xABCDEF0123。
结合前面所说的如果定义一个无符号类型的变量,并且赋值二进制数,那就可以写成:
unsigned char dev_ctl_reg = 0b10100100U
这里有些读者可能会疑惑,我们平时在编程的时候,十进制用起来非常直观,易于常人理解,为何非得咨询麻烦,使用二进制常量赋值呢?这是因为当我们在做一些硬件编程的时候,比如单片机,已知它有一个寄存器是控制它外面的数字量输入输出引脚电平高低的,这个寄存器的说明如图3-6-1。这是一个八位的寄存器,每一位控制一个IO口,如果对相应位写1,那么这一位对应的IO口输出高电平,如果对相应位写0,那么这一位对应的IO口输出低电平。
图3-6-1某IO控制寄存器
此时如果我们需要控制PA_7和PA4输出高电平,其余都输出高电平,那要怎么做?只需要将一个二进制数值的第七位和第四位设置成1,其余位为0,并且将这个值赋给IOA这个寄存器即可,那么此时使用二进制数值常量的优点就体现出来了,如果用十进制数值,那计算起来也是个工作量,只需要“IOA = 0b10010000U;”即可。
最后,如果需要对一个long类型的整型变量赋值一个长整型常量,那么需对这个常量加一个后缀L,当然后缀是可以叠加的,如一个无符号的长整型常量,可以写成“0x23AUL”。
浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。
当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。当使用指数形式表示时,必须包含小数点、指数,或同时包含两者。同样的,浮点数常量通过后缀加字母F(f)用来表示其为浮点数,如:
float length = 1.88f;
对于一些长度比较长的数值,我们可以用指数的形式来表示他,比如10000.0可以写成1.0*10^4,在C语言中,可以把“*10^”这一个整体用字母“E”或者“e”替代,即可写成1E4,同样的,如果要定义0.00001,可以写成1*10^(-5),即为1E-5。
字符常量在3.5节中已经详细讲过,就是用单引号’’,将ASCII字符引入,即是字符常量。
联系客服