目录
本篇原文为:C语言数据类型详解:字符、整数、浮点数等基础
更多C++进阶、rust、python、逆向等等教程,可点击此链接查看:酷程网
1.前言
C 语言的每一种数据,都是有类型(type)的,编译器必须知道数据的类型,才能操作数据。
而从本质上来说,“类型”实际上就是在定义一个变量的内存大小,以及应该如何去操作这个变量。
基本数据类型有三种:字符(char)、整数(int)和浮点数(float)。复杂的类型都是基于它们构建的。
2.字符类型
字符类型指的是单个字符,类型声明使用char
关键字。
char c = 'B';
上面示例声明了变量c
是字符类型,并将其赋值为字母B
。
C 语言规定,字符常量必须放在单引号里面。
在计算机内部,字符类型使用一个字节(8位)存储。C 语言将其当作整数处理,所以字符类型就是宽度为一个字节的整数。每个字符对应一个整数(由 ASCII 码确定),比如B
对应整数66
。
字符类型在不同计算机的默认范围是不一样的。一些系统默认为-128
到127
,另一些系统默认为0
到255
。这两种范围正好都能覆盖0
到127
的 ASCII 字符范围。
只要在字符类型的范围之内,整数与字符是可以互换的,都可以赋值给字符类型的变量,这用到了ASCII码表的转换。
char c = 66;
// 等同于
char c = 'B';
上面示例中,变量c
是字符类型,赋给它的值是整数66。这跟赋值为字符B
的效果是一样的。
从本质上来说,字符其实和数字是没什么区别的。
比如两个字符类型的变量可以进行数学运算。
char a = 'B'; // 等同于 char a = 66;
char b = 'C'; // 等同于 char b = 67;
printf("%d\n", a + b); // 输出 133
上面示例中,字符类型变量a
和b
相加,视同两个整数相加。占位符%d
表示输出十进制整数,因此输出结果为133。
单引号本身也是一个字符,如果要表示这个字符常量,必须使用反斜杠转义。
char t = '\'';
上面示例中,变量t
为单引号字符,由于字符常量必须放在单引号里面,所以内部的单引号要使用反斜杠转义。
这种转义的写法,主要用来表示 ASCII 码定义的一些无法打印的控制字符,它们也属于字符类型的值。
\a
:警报,这会使得终端发出警报声或出现闪烁,或者两者同时发生。\b
:退格键,光标回退一个字符,但不删除字符。\f
:换页符,光标移到下一页。在现代系统上,这已经反映不出来了,行为改成类似于\v
。\n
:换行符。\r
:回车符,光标移到同一行的开头。\t
:制表符,光标移到下一个水平制表位,通常是下一个8的倍数。\v
:垂直分隔符,光标移到下一个垂直制表位,通常是下一行的同一列。\0
:null 字符,代表没有内容。注意,这个值不等于数字0。
转义写法还能使用八进制和十六进制表示一个字符。
\nn
:字符的八进制写法,nn
为八进制值。\xnn
:字符的十六进制写法,nn
为十六进制值。
char x = 'B';
char x = 66;
char x = '\102'; // 八进制
char x = '\x42'; // 十六进制
上面示例的四种写法都是等价的。
3.整数类型
整数类型用来表示较大的整数,类型声明使用int
关键字。
int a;
上面示例声明了一个整数变量a
。
不同计算机的int
类型的大小是不一样的。比较常见的是使用4个字节(32位)存储一个int
类型的值,但是2个字节(16位)或8个字节(64位)也有可能使用。它们可以表示的整数范围如下。
- 16位:-32,768 到 32,767。
- 32位:-2,147,483,648 到 2,147,483,647。
- 64位:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
C 语言使用signed
关键字,表示一个类型带有正负号,包含负值;使用unsigned
关键字,表示该类型不带有正负号,只能表示零和正整数。
对于int
类型,默认是带有正负号的,也就是说int
等同于signed int
。由于这是默认情况,关键字signed
一般都省略不写,但是写了也不算错。
signed int a;
// 等同于
int a;
int
类型也可以不带正负号,只表示非负整数。这时就必须使用关键字unsigned
声明变量:
unsigned int a;
整数变量声明为unsigned
的好处是,同样长度的内存能够表示的最大整数值,增大了一倍。比如,16位的signed int
最大值为32767,而unsigned int
的最大值增大到了65535。
unsigned int
里面的int
可以省略,所以上面的变量声明也可以写成下面这样。
unsigned a;
字符类型char
也可以设置signed
和unsigned
。
signed char c; // 范围为 -128 到 127
unsigned char c; // 范围为 0 到 255
注意,C 语言规定char
类型默认是否带有正负号,由当前系统决定。这就是说,char
不等同于signed char
,它有可能是signed char
,也有可能是unsigned char
,这一点与int
不同,int
就是等同于signed int
。
如果int
类型使用4个或8个字节表示一个整数,对于小整数,这样做很浪费空间,另一方面,某些场合需要更大的整数,8个字节还不够。
为了解决这些问题,C 语言在int
类型之外,又提供了三个整数的子类型。这样有利于更精细地限定整数变量的范围,也有利于更好地表达代码的意图。
short int
(简写为short
):占用空间不多于int
,一般占用2个字节(整数范围为-32768~32767)。long int
(简写为long
):占用空间不少于int
,至少为4个字节。long long int
(简写为long long
):占用空间多于long
,至少为8个字节。
short int a;
long int b;
long long int c;
上面代码分别声明了三种整数子类型的变量。
默认情况下,short
、long
、long long
都是带符号的(signed),即signed
关键字省略了。它们也可以声明为不带符号(unsigned),使得能够表示的最大值扩大一倍。
unsigned short int a;
unsigned long int b;
unsigned long long int c;
C 语言允许省略int
,所以变量声明语句也可以写成下面这样。
short a;
unsigned short a;
long b;
unsigned long b;
long long c;
unsigned long long c;
不同的计算机,数据类型的字节长度是不一样的。
确实需要32位整数时,应使用long
类型而不是i