C语言是一种非常重要的编程语言,在计算机编程领域,它广泛应用于各种开发工作中。学习C语言的一个重要方面就是学习基础数据类型。本文将详细介绍C语言的数据类型,并提供一些实际的使用示例。
1.整型(int)
取值范围
在计算机系统中,int类型一般采用补码表示法。所以一个长度为32位的int型变量能够表示的整数范围是:-2,147,483,648 到 2,147,483,647。
然而,这只是包括大多数电脑的情况。在不同的计算机架构和编译器下,int类型取值范围可能会略有差异。以下是一些常见的计算机下,int类型可能出现的不同取值范围:
系统 | int类型取值范围 |
---|---|
16位系统 | -32768 到 32767 |
32位系统 | -2147483648 到 2147483647 |
64位系统 | -9223372036854775808 到 9223372036854775807 |
要确保代码在不同的系统上都能正确运行,最好使用标准的数据类型,并且不要对数据类型的大小作出任何假设。如果需要确保int类型的大小为特定值,可以使用C99标准中的stdint.h头文件中定义的具有固定大小的int类型,例如int16_t、int32_t或int64_t。
储存
Int类型通常是以二进制的形式存储在计算机的内存中。在32位的操作系统中,一个int类型占用4个字节的内存空间,即32个比特位,可以表示范围为-2147483648到2147483647的整数。
声明
int value;
其他格式:
int value1, value2, value3;
赋值
int value = 233;
错误示例
1.未给变量赋初值
int a; // 声明一个整型变量a,但没有为其赋初值
printf("%d", a); // 程序将输出当时存储在变量a中的随机数值
输出:4199240(不同环境下不同)
2.将超出范围的值赋给变量
int b = 2147483648; // 错误示例:尝试将一个大于变量能表达的最大值的数字赋给了变量b
printf("%d", b); // 输出结果不可预知,可能会因越界而导致程序运行异常
输出:-2147483648
解释:整数b当到它能表示的最大值时,会重新从起点开始(取值范围可以回看上文)。
3.使用浮点数初始化 int 变量
int c = 3.14159; // 错误示例:使用浮点数作为设定变量c的初值
printf("%d", c); // 输出结果会被截断成整数部分值,即3
输出:3
4.糟糕的初始化格式
int d , e = 13; // 有效,但这种格式很糟糕
printf("%d %d", d, e); // d未初始化,输出结果不可预测
输出:4199256 13
解释:以上代码很容易让人以为d和e都被赋值为13,实则没有。
其他整数类型
C语言提供3个附属关键字修饰基本整数类型:short、long和unsigned。
1.short int(short):通常占用2个字节的存储空间(16位),范围从 -32,768 到 32,767。在一些需要大量状态跟踪、但对数字级别需求不高时可以使用,也可用于优化处理特定类型任务。
2.long int(long):通常是4个字节(32位)或8个字节(64位)。其最小值为LONG_MIN(-2147483648),最大值为 LONG_MAX(2147483647)。long int比int同样可以保存整数,因此有一种经常看到的做法是直接声明变量为“long”而不是“long int”,两者等价。
3.long long int(long long):占据8个字节(64位)。它表示一个比long int还要大的整数,在必须使用超过现有数据类型所提供的极限时很有用。在C99标准中被正式定义。
4.unsigned int(unsigned):可以存储0到4294967295之间的整数。它和int的存储长度相同,但不保留符号位,所以能够表示的非负整数范围加倍,即为0至4294967295整数范围。
在C90标准中,添加了unsigned long int(unsigned long)和unsigned short int(unsigned short)。在C99标准中,又添加了unsigned long long int(unsigned long long)
总体来说,short int用于那些仅仅需要较低精度控制、针对书写性能较好的场景;long int则可以被视作标准的整数类型,常用作保存数据的容器;而long long int可以看做是更高精度要求下的备选方案,在一些特殊计算中会发挥很好的作用。至于unsigned int,则可以使用在正整数表示相关及性能优化场景内。不同情况下应该根据需求认真选择使用。
2.字符型(char)
char类型是一种非常基础的数据类型,常用于表示单个字符或者整个字符串中的某个字符。在大多数编程语言中,char类型占用1个字节的内存空间,即8个比特位。一个char类型的变量可以表示256种不同的字符,包括小写字母、大写字母、数字、标点符号、空格等等。
储存
但是从技术层面看,char是整数类型。因为char类型实际上存储的是整数而不是字符。——《C Primer Plus》
以上是储存在内存中的字母C,在char类型中它表示字母C,在int类型中它表示67,这数字67也叫字母C的ANSIC码值。以下是常见的字符及其ANSIC码值
字符 | ASCII码值 |
---|---|
空格(space) | 32 |
数字0~9 | 48~57 |
大写字母A~Z | 65~90 |
小写字母a~z | 97~122 |
换行符(newline) | 10 |
制表符(tab) | 9 |
初始化
char a = 'A';
实际上,字符是以数值形式储存的,所以也可使用数字代码值来赋值。——《C Primary Plus》
就例如:
char a = 67;//这样做没问题,相当于char a = 'A';
但这是一种不好的编程风格,用’A’赋值才是更为妥当的做法。
错误示例
char a = A;//错误!此时A是一个变量
char b = "B"//错误!此时"B"是一个字符串
应注意的是,在C语言中,单引号括起来的是一个字符常量,双引号括起来的是一个字符串常量。
3.浮点型(float、double)
浮点类型能表示包括小数在内的更大的数。——《C Primary Plus》
浮点型是C语言中的一种数据类型,用于表示实数数值,即具有小数部分的数。和整数不同,浮点型的数值可以是小数、分数、乘方等形式的。在C语言中,浮点型有两种:单精度浮点数(float)和双精度浮点数(double)。
储存
浮点型在内存中存储的方式是将浮点数转换成二进制数,再将这些二进制数的位存储在内存中。浮点数通常由三部分组成:符号,尾数和指数。
单精度浮点数(float)和双精度浮点数(double)
单精度浮点数float通常占用4个字节(32比特位)的内存,双精度浮点数double则通常占用8个字节(64比特位)的内存。一般来说,使用double可以获得更高的精度,但同时也会消耗更多的内存。由于内存对于程序的性能影响非常大,所以在选择使用哪种类型的浮点数时,需要权衡精度和内存的需求
值得注意的是,由于计算机在处理浮点数时通常会出现精度误差,所以在精度要求较高的情况下,有时候需要使用特殊的算法或库来解决精度问题。
浮点类型 | 取值范围 |
---|---|
float类型 | 1.175494e-38 ~ 3.402823e38 |
double类型 | 2.225074e-308 ~ 1.797693e308 |
声明
浮点型变量与整形变量初始化方式相同。
float a, b;
float c;
double d, e;
double f;
赋值
a = 1.0E+12;
b = 2.0e+12;
下面是一些浮点型常量的示例:
3.141596
.2
4e16
.8e16
.8E-5
100.
注意:不要在浮点型常量中加空格,例如1.12 E+12(错误!)
还有一些特殊的浮点型常量:
-INFINITY//无穷大
1.0 / 0.0 // 正无穷大
-1.0 / 0.0 // 负无穷大
0.0 / 0.0 // NaN
INFINITY是表示负无穷大的一个特殊符号。它通常出现在一些特殊计算中,例如某些超限比较或除以0的操作。在C语言中,除以0的结果是无穷大,而正数除以负数的结果是负无穷大,负数除以正数的结果是负无穷大。此外C语言还有定义一个NaN(Not a Number),在处理无穷大除以无穷大时它会出现。
4._Bool类型
bool类型是一个表示逻辑真假的数据类型,它只有两个取值:true(真)和false(假)。在C语言中,bool类型是由C99标准引入的,通常被定义为1个字节(8位),其中0代表false,非0代表true。
使用bool类型可以使代码更具可读性和可维护性,因为bool类型能够直接表示逻辑真假。例如,代码中的条件表达式(例如if语句、while语句)可以直接使用bool类型变量作为条件。在代码中使用bool类型可以明确表示这个变量是一个逻辑真假值,防止出现不必要的错误。
它可以这样初始化:
// 初始化变量
_Bool flag = 1;
_Bool flag = 0;
//上下两者等价
_Bool flag = true;
_Bool flag = false;
5.复数和虚数类型
_Complex类型:
这是C语言中的一种特殊类型,可以表示复数类型的浮点数。_Complex类型包含real和imag两部分,分别表示实部和虚部。它是C99标准中新增的特性,可以在合适的开发环境下使用。
_imaginery类型:
_imaginery这也是C语言中的一个特殊内置类型,在C99标准中引入。它用于表示一个虚数,并且可以进行基本的算术运算。使用它时需要包含头文件complex.h。
各数据类型储存范围
C语言中所有数据类型储存范围的表格总结:
数据类型 | 大小(字节) | 取值范围(有符号) | 取值范围(无符号) |
---|---|---|---|
char | 1 | -128 到 127 | 0 到 255 |
signed char | 1 | -128 到 127 | - |
unsigned char | 1 | - | 0 到 255 |
short | 2 | -32,768 到 32,767 | - |
unsigned short | 2 | - | 0 到 65,535 |
int | 4 | -2,147,483,648 到 2,147,483,647 | - |
unsigned int | 4 | - | 0 到 4,294,967,295 |
long | 4 | -2,147,483,648 到 2,147,483,647 | - |
unsigned long | 4 | - | 0 到 4,294,967,295 |
long long | 8 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | - |
unsigned long long | 8 | - | 0 到 18,446,744,073,709,551,615 |
float | 4 | 1.2E-38 到 3.4E+38 | - |
double | 8 | 2.2E-308 到 1.8E+308 | - |
long double | 16 | 3.4E-4932 到 1.1E+4932 | - |
sizeof是C语言的内置运算符,以字节单位给出指定类型的大小,C99和C11提供%zd转换说明匹配sizeof的返回类型。输入以下代码,会列出当前系统的各类型的大小:
#include <stdio.h>
int main()
{
printf("%13s类型的大小为:%zd字节\n", "short",sizeof(int));
printf("%13s类型的大小为:%zd字节\n", "long int",sizeof(long int));
printf("%13s类型的大小为:%zd字节\n", "long long int",sizeof(long long int));
printf("%13s类型的大小为:%zd字节\n", "short int",sizeof(short int));
printf("%13s类型的大小为:%zd字节\n", "char",sizeof(char));
printf("%13s类型的大小为:%zd字节\n", "float",sizeof(float));
printf("%13s类型的大小为:%zd字节\n", "double",sizeof(double));
printf("%13s类型的大小为:%zd字节\n", "long double",sizeof(long double));
printf("%13s类型的大小为:%zd字节\n", "_Bool",sizeof(bool));
return 0;
}
作者也正在学习中,文章中的不足之处读者可以在评论区指出,QQ:2685240198。