【C语言基础】基本数据类型和常量介绍
博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持!
博主链接
博客内容主要围绕:
5G/6G协议讲解
高级C语言讲解
Rust语言讲解
文章目录
- 基本数据类型和常量介绍
- 一、整数类型 int
- 二、浮点数值类型 float
- 三、扩展精度类型 double
- 四、单字符类型 char
- 五、布尔数据类型 _Bool
- 六、类型说明符 long、long long、short、unsigned和signed
- 七、类型测试示例
基本数据类型和常量介绍
之前博客已经介绍过C语言的基本数据类型int,声明为int
类型的变量只能用于存储整型值,即没有小数点的值。C编程语言还提供了另外4种基本数据类型:float
、double
、char
和_Bool
。声明为float
类型的变量可用于存储浮点数(包含小数位的值)。double
类型与float类型相同,只是精度大约是float的两倍。char
类型可以用来存储单个字符,比如字母‘a’、数字‘6’或分号(‘;’)。最后,_Bool
数据类型仅可用于存储值0或1。这种类型的变量用于表示开/关、是/否或真/假的情况。这种非此即彼的选择也称为二元选择。
在C语言中,任何数字、单个字符或字符串都被称为常量
(constant)。例如,数字58表示一个常量整数值。字符串“Programming in C is fun.\n”是常量字符串的一个例子。完全由常量值组成的表达式称为常量表达式(constant expression)。下面的表达式就是一个常量表达式,因为表达式中的每一项都是一个常数值:
128 + 7 - 17
另外,如果下面的表达式中,变量i
被声明为一个整数变量,则这个表达式就不是常量表达式了。因为它的值会根据i
的取值而变化。如果i
为10,表达式的值等于125,而如果i
的值是200,则表达式的值就变成了-65。
128 + 7 – i
类型 | 常量举例 | printf字符 |
---|---|---|
char | ‘a’,’\n’ | %c |
_Bool | 0,1 | %i,%u |
short int | — | %hi,%hx,%ho |
unsigned short int | — | %hu,%hx,%ho |
int | 12,-97,0xFFE0,0177 | %i,%x,%o |
unsigned int | 12u,100U,0XFFu | %u,%x,%o |
long int | 12L,-2001,0xffffL | %li,%lx,%lo |
unsigned long int | 12UL,100ul,0xffeeUL | %lu,%lx,%lo |
long long int | 0xe5e5e5e5LL,500ll | %lli,%llx,%llo |
unsigned long long int | 12ull,0xffeeULL | %llu,%llx,%llo |
float | 12.34f,3.1e-5f,0x1.5p10,0x1P-1 | %f,%e,%g,%a |
double | 12.34,3.1e-5,0x.1p3 | %f,%e,%g,%a |
long double | 12.34l,3.1e-5l | %Lf,%Le,%Lg |
一、整数类型 int
在C语言中,整数常数是由一个或多个数字组成的序列。序列前面的减号表示值是负数。158、−10和0都是有效的整数常量。数字之间不能有空格,大于999的值不能用逗号表示。(因此,12,000不是一个有效的整数常量,必须写成12000)
C语言中的两种特殊格式允许整数常量以非十进制(以10为基数)格式表示。如果整数的第一位是0,则表示使用八进制(octal)数表示,即以8为基数。在这种情况下,值的剩余数字必须是有效的八进制数字,因此必须是0 ~ 7。因此,要在C语言中表示八进制数50,即十进制的40,就使用表示法050。类似地,八进制常量0177表示十进制值127 (1 × 64 + 7 × 8 + 7)。通过在printf()语句的格式字符串中使用格式字符%o
,可以在终端以八进制表示法显示整数值。在这种情况下,该数值显示为不带前导零的八进制形式。使用格式字符%#o会在八进制值之前显示前导零。
如果整数常量前面有一个0和字母x(大写或小写),则该值被认为是以十六进制(以16为基数)表示的。紧跟在字母x之后的是十六进制值的数字,可以由数字0~9和字母a~f(或A~F)组成。这些字母分别表示值10~15。因此可以使用下面的语句将十六进制值FFEF0D赋值给一个名为rgbColor的整数变量。
rgbColor = 0xFFEF0D;
此外,可以使用格式字符%x
显示一个不带前导0x的十六进制值,并且使用小写字母a~f表示十六进制数字。如果要显示以0x开头的值,可以使用格式字符%#x
,如下所示。
printf ("Color is %#x\n", rgbColor);
要用大写字母显示前导x和随后的十六进制数位,可以使用一个大写的x,如%X
或%#X
。
二、浮点数值类型 float
一个声明为float
类型的变量可用于存储包含小数位的值。通过是否有小数点来区分浮点数常数。你可以省略小数点前的数字或小数点后的数字,但显然不能省略两者。数值3.、125.8、-.0001都是有效的浮点常量。要在终端显示浮点数,需要使用printf()转换字符%f
。
浮点常量也可以用科学记数法(scientific notation)表示。数值1.7e4就是用这种表示法表示的浮点数,表示1.7×。字母e前面的值称为尾数(mantissa),后面的值称为指数(exponent)。指数表示10的幂,且该指数前面可以有一个可选的加号或减号,尾数将与这个幂值相乘。因此,在常数2.25e−3中,2.25是尾数的值,−3是指数的值。该常数表示值2.25×,即0.00225。顺便说一下,用于将尾数和指数分开的字母e,既可以用小写也可以用大写。
要用科学记数法显示值,应该在printf()格式字符串中指定格式字符%e
。printf()格式字符%g
可用于让printf()决定以普通浮点记数法还是科学记数法显示浮点值。这个判断基于指数的值:如果指数小于-4或大于5,则使用%e(科学记数法)格式;否则,使用%f格式。
使用%g格式字符显示浮点数,它可以生成最美观的输出。一个十六进制(hexadecimal)浮点常数包含一个前导0x或0X,随后是一个或多个十进制或十六进制数字,然后是一个p或P,最后是一个可选的有符号的二进制指数。例如,0x0.3p10表示值3/16×= 192.0。
三、扩展精度类型 double
double
类型与float类型非常相似,但当float变量提供的范围不够时,可以使用它。声明为double类型的变量所能存储的有效位数大约是float类型变量的两倍。大多数计算机使用64位来表示双精度值。
除非另有说明,否则所有浮点常量都被C语言编译器视为double值。若要显式表示一个float常数,可以在数字后面追加f或F,如下所示:
12.5f
要显示double值,可以使用格式字符%f、%e或%g,它们与用于显示float值的格式字符相同。
四、单字符类型 char
一个char
变量可用于存储单个字符。一个字符常量用一对单引号括起来。所以’a’、’;’和’0’都是有效的字符常量例子。第一个常量表示字母a,第二个是分号,第三个是字符0,它与数字0不同。不要将字符常量(用单引号括起来的单个字符)和字符串(用双引号括起来的任意数量的字符)混淆。
字符常量’\n’(换行符)是一个有效的字符常量,尽管它似乎与前面提及的规则相矛盾。这是因为反斜杠字符在C语言系统中是一个特殊字符,实际上并不算字符。换句话说,C语言编译器将字符’\n’视为单个字符,尽管它实际上是由两个字符组成的。还有其它以反斜杠字符开头的特殊字符。
在终端上显示char变量的值,可以在printf()调用中使用格式字符%c
。
五、布尔数据类型 _Bool
_Bool
变量在语言中定义得足够大以存储值0和1。但对它使用的精确内存数量未做明确规定。_Bool变量用于需要表示布尔条件的程序中。例如,可以使用这种类型的变量表示是否已经从文件中读取了所有数据。
按照惯例,0用来表示假值,1表示真值。当给_Bool变量赋值时,0的值在变量内部被存储为0,而任何非0的值都被存储为1。
为了能够在程序中更容易地使用_Bool变量,在标准头文件<stdbool.h>中定义了值bool、true和false。
六、类型说明符 long、long long、short、unsigned和signed
如果将long
说明符直接放在int
声明的前面,则声明的整型变量将在某些计算机系统上具有扩展的范围。下面是一个long int声明的例子:
long int factorial;
上面的语句将变量factorial声明为一个long整型变量。与float和double一样,long变量的精度取决于特定的计算机系统。在许多系统上,int和long int的取值范围相同,二者都可用于存储32位宽的整数值(即2147483647以内的整数值)。
可以通过在整型常量的末尾追加字母L(大写或小写),可以构成一个long int类型的常量值。数字和L之间不允许有空格。因此,下面的语句将numberOfPoints声明为一个long int类型,并为其赋初值131071100。
long int numberOfPoints = 131071100L;
要使用printf()显示long int的值,可以在整数格式字符i、o和x之前添加字母 l
作为修饰符。这意味着格式字符%li
可以显示十进制格式的long int值,字符%lo可以显示八进制格式的值,字符%lx可以显示十六进制格式的值。
此外,还有一种long long整型数据类型:
long long int maxAllowedStorage;
上面的语句将所示变量声明为指定的扩展精度,保证至少64位宽。为了显示long long整数,需要在printf字符串中使用了两个l,而不是单个字母l,如”%lli
"。
long说明符也允许出现在double声明前,如下所示:
long double US_deficit_2004;
通过在long double常量后面添加字母l或L被写成一个浮点常量,例如
1.234e+7L
要显示一个long double值,可以使用L修饰符。因此,%Lf
在浮点表示法中显示long double值,%Le在科学表示法中显示相同的值,而%Lg告诉printf()在%Lf和%Le之间进行选择。
说明符short放在int声明的前面时,告诉C语言编译器正在声明的特定变量用于存储相当小的整数值。使用short变量主要是为了节省内存空间,在程序需要大量内存且可用内存数量有限的情况下,这可能会成为一个问题。
在某些机器上,一个short int变量所占的存储空间只有常规int变量的一半。在任何情况下,都可以保证为short int类型分配的内存空间量不少于16位。
在C语言中,无法明确地编写一个short int类型的常量。要显示short int变量,需要将字母h
放在任何普通整数转换字符之前:%hi
、%ho
或%hx
。或者,你也可以使用任何整数转换字符来显示short int,这是因为在将它们作为参数传递给printf()函数时,它们可以被转换为整数。
当一个整数变量仅用于存储正数时,可以将unsigned
说明符放在int变量前面。如下面的代码所示。下面的代码向编译器声明counter变量仅用于存储正数值。通过将整数变量的使用限制为仅存储正整数,可以扩展整数变量的精度。
unsigned int counter;
通过在常量后面添加u
(或者U)可以构成一个unsigned int常量,如下所示:
0x00ffU
在写整型常量时,你可以把字母u(或U)和l(或L)组合起来,如下面代码所示。目的是告诉编译器将常量20000视为unsigned long变量。
20000UL
如果一个整型常量后面没有任何字母u、U、l或L,而且它太大而无法存入普通大小的int中,编译器会将其视为unsigned int。如果它太大,无法放入unsigned int,编译器会将其视为long int。如果它仍然无法装入long int,编译器会将其转换为unsigned long int。如果还不适合,编译器将其视为long long int类型,否则视为unsigned long long int类型。
可以使用signed
限定符明确地告诉编译器某个特定变量是有符号量。
七、类型测试示例
#include <stdio.h>
int main (void)
{
int integerVar = 100;
float floatingVar = 331.79;
double doubleVar = 8.44e+11;
char charVar = 'W';
_Bool boolVar = 0;
printf ("integerVar = %i\n", integerVar);
printf ("floatingVar = %f\n", floatingVar);
printf ("doubleVar = %e\n", doubleVar);
printf ("doubleVar = %g\n", doubleVar);
printf ("charVar = %c\n", charVar);
printf ("boolVar = %i\n", boolVar);
return 0;
}
程序输出如下:
integerVar = 100
floatingVar = 331.790009
doubleVar = 8.440000e+11
doubleVar = 8.44e+11
charVar = W
boolVar = 0;