在了解数据类型之前,我们需要先了解一下这些概念 位、字节和字。
位、字节和字都是对计算机存储单元的描述。在计算机世界中,最小的单元是
位(bit)
,一个位就表示一个 0 或 1,一般当你的小伙伴问你的电脑是 xxx 位,常见的有 32 位或者 64 位,这里的位就指的是比特,比特就是 bit 的中文名称,所以这里的 32 位或者 64 位指的就是 32 bit 或者 64 bit。字节是基本的存储单元,基本存储单元说的是在计算机中都是按照字节来存储的,一个字节等于 8 位,即 1 byte = 8 bit。字是自然存储单位,在现代计算机中,一个字等于 2 字节。
C 语言的数据类型有很多,下面我们就来依次介绍一下。
整型
C 语言中的整型用 int
来表示,可以是正整数、负整数或零。在不同位数的计算机中其取值范围也不同。不过在 32 位和 64 位计算机中,int 的取值范围是都是 2^32 ,也就是 -2147483648 ~ +2147483647,无符号类型的取值范围是 0 ~ 4294967295。
整型以二进制整数存储,分为有符号数和无符号数两种形态,有符号数可以存储正整数、负整数和零;无符号只能存储正整数和零。
可以使用 printf 打印出来 int 类型的值,如下代码所示。
1
2
3
4
5
6
7
8
9
10
11
12#include int main(){ int a = -5; printf("%d ",a); unsigned int b = 6; printf("%d ",b); }
C 语言还提供 3 个附属关键字修饰整数类型,即 short、long 和 unsigned。
- short int 类型(或者简写为 short)占用的存储空间
可能
比 int 类型少,适合用于数值较小的场景。 - long int 或者 long 占用的存储空间
可能
比 int 类型多,适合用于数值较大的场景。 - long long int 或者 long long(C99 加入)占用的存储空间比 long 多,适用于数值更大的场合,至少占用 64 位,与 int 类似,long long 也是有符号类型。
- unsigned int 或 unsigned 只用于非负值的场景,这种类型的取值范围有所不同,比如 16 位的 unsigned int 表示的范围是 0 ~ 65535 ,而不是 -32768 ~ 32767。
- 在 C90 标准中,添加了 unsigned long int 或者 unsigned long 和 unsigned short int 或 unsigned short 类型,在 C99 中又添加了 unsigned long long int 或者 unsigned long long 。
- 在任何有符号类型前面加 signed ,可强调使用有符号类型的意图。比如 short、short int、signed short、signed short int 都表示一种类型。
比如上面这些描述可以用下面这些代码来声明:
1
2
3
4
5
6
7
8
9
10long int lia; long la; long long lla; short int sib; short sb; unsigned int uic; unsigned uc; unsigned long uld; unsigned short usd;
这里需要注意一点,unsigned 定义的变量,按照 printf 格式化输出时,是能够显示负值的,为什么呢?不是 unsigned 修饰的值不能是负值啊,那是因为 unsigned 修饰的变量,在计算时会有用,输出没什么影响,这也是 cxuan 刚开始学习的时候踩的坑。
上面在说 short int 和 long int 的时候,都加了一个可能,怎么,难道 short int 和 long int 和 int 还不一样吗?
这里就是 C 语言数据类型一个独特的风格。
为什么说可能,这是由于 C 语言为了适配不同的机器来设定的语法规则,在早起的计算机上,int 类型和 short 类型都占 16 位,long 类型占 32 位,在后来的计算机中,都采用了 16 位存储 short 类型,32 位存储 int 类型和 long 类型,现在,计算机普遍使用 64 位 CPU,为了存储 64 位整数,才引入了 long long 类型。所以,一般现在个人计算机上常见的设置是 long long 占用 64 位,long 占用 32 位,short 占用 16 位,int 占用 16 位或者 32 位。
char 类型
char 类型一般用于存储字符,表示方法如下
1
2
3char a = 'x'; char b = 'y';
char 被称为字符类型,只能用单引号 '' 来表示,而不能用双引号 “” 来表示,这和字符串的表示形式相反。
char 虽然表示字符,但是 char 实际上存储的是整数而不是字符,计算机一般使用 ASCII
来处理字符,标准 ASCII 码的范围是 0 - 127 ,只需 7 位二进制数表示即可。C 语言中规定 char 占用 1 字节。
其实整型和字符型是相通的,他们在内存中的存储本质是相通的,编译器发现 char ,就会自动转换为整数存储,相反的,如果给 int 类型赋值英文字符,也会转换成整数存储,如下代码
1
2
3
4
5
6
7
8
9
10
11
12#include int main(){ char a = 'x'; int b; b = 'y'; printf("%d %d ",a,b); }
输出
120
121
所以,int 和 char 只是存储的范围不同,整型可以是 2 字节,4 字节,8 字节,而字符型只占 1 字节。
有些 C 编译器把 char 实现为有符号类型,这意味着 char 可表示的范围是 -128 ~ 127,而有些编译器把 char 实现为无符号类型,这种情况下 char 可表示的范围是 0 - 255。signed char 表示的是有符号类型,unsigned char 表示的是无符号类型。
_Bool 类型
_Bool 类型是 C99 新增的数据类型,用于表示布尔值。也就是逻辑值 true 和 false。在 C99 之前,都是用 int 中的 1 和 0 来表示。所以 _Bool 在某种程度上也是一种数据类型。表示 0 和 1 的话,用 1 bit(位)表示就够了。
float、double 和 long double
整型对于大多数软件开发项目而言就已经够用了。然而,在金融领域和数学领域还经常使用浮点数
。C 语言中的浮点数有 float、double 和 long double 类型。浮点数类型能够表示包括小数在内更大范围的数。浮点数能表示小数,而且表示范围比较大。浮点数的表示类似于科学技术法。下面是一些科学记数法示例:
数字 | 科学记数法 | 指数记数法 |
---|---|---|
1000000000 | 1 * 10^9 | 1.0e9 |
456000 | 4.56 * 10^5 | 4.56e5 |
372.85 | 3.7285 * 10 ^ 2 | 3.7285e2 |
0.0025 | 2.5 * 10 ^ -3 | 2.5e-3 |
C 规定 float 类型必须至少能表示 6 位有效数字,而且取值范围至少是 10^-37 ~ 10^+37。通常情况下,系统存储一个浮点数要占用 32 位。
C 提供的另一种浮点类型是 double(双精度类型)。一般来说,double 占用的是 64 位而不是 32 位。
C 提供的第三种类型是 long double ,用于满足比 double 类型更高的精度要求。不过,C 只保证了 long double 类型至少与 double 类型相同。
浮点数的声明方式和整型类似,下面是一些浮点数的声明方式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#include int main(){ float aboat = 2100.0; double abet = 2.14e9; long double dip = 5.32e-5; printf("%f ", aboat); printf("%e ", abet); printf("%Lf ", dip); }
printf() 函数使用 %f 转换说明打印十进制计数法的 float 和 double 类型浮点数,用 %e 打印指数记数法的浮点数。打印 long double 类型要使用 %Lf 转换说明。
关于浮点数,还需要注意其上溢
和下溢
的问题。
上溢指的是是指由于数字过大,超过当前类型所能表示的范围,如下所示
1
2
3
4float toobig = 3.4E38 * 100.0f; printf("%e ",toobig);
输出的内容是 inf
,这表示 toobig 的结果超过了其定义的范围,C 语言就会给 toobig 赋一个表示无穷大的特定值,而且 printf 显示值为 inf 或者 infinity 。
下溢:是指由于数值太小,低于当前类型所能表示的最小的值,计算机就只好把尾数位向右移,空出第一个二进制位,但是与此同时,却损失了原来末尾有效位上面的数字,这种情况就叫做下溢。比如下面这段代码
1
2
3
4float toosmall = 0.1234e-38/10; printf("%e ", toosmall);
复数和虚数类型
许多科学和工程计算都需要用到复数和虚数,C99 标准支持复数类型和虚数类型,C 语言中有 3 种复数类型:float _Complex、double _Complex 和 long double _Complex。
C 语言提供的 3 种虚数类型:float _Imaginary、 double _Imaginary 和 long double _Imaginary。
如果包含 complex.h 头文件的话,便可使用 complex 替换 _Complex,用 imaginary 替代 _Imaginary。
其他类型
除了上述我们介绍过的类型之外,C 语言中还有其他类型,比如数组、指针、结构和联合,虽然 C 语言没有字符串类型,但是 C 语言却能够很好的处理字符串。
最后
以上就是正直小刺猬最近收集整理的关于C语言的数据类型的全部内容,更多相关C语言内容请搜索靠谱客的其他文章。
发表评论 取消回复