数据类型全解析
目录
一、字符型 (Character Types)
二、整型 (Integer Types)
短整型 (Short Integer)
标准整型 (Integer)
长整型 (Long Integer)
超长整型 (Long Long Integer) - C99引入
三、浮点型 (Floating-Point Types)
四、布尔类型 (Boolean Type)
布尔类型使用说明:
标准库定义:
代码示例:
注意:
五、各种数据类型的长度
sizeof 操作符
基本语法
重要特性
关于 size_t 类型
示例代码
基本数据类型长度
sizeof 不计算表达式
原理说明:
C语言提供了丰富的数据类型用于描述现实世界中的各类数据:
- 整型用于表示整数
- 字符型用于处理字符
- 浮点型则用于存储小数
数据类型本质上是一类相似数据的共同特征。编译器需要明确数据类型才能正确执行相关操作。
接下来我们将系统梳理C语言中的数据类型体系,本章重点讨论内置数据类型。
一、字符型 (Character Types)
-
char
// 基础字符类型 -
signed char
// 有符号字符型,范围通常为 -128 到 127 -
unsigned char
// 无符号字符型,范围通常为 0 到 255
二、整型 (Integer Types)
短整型 (Short Integer)
-
short [int]
-
signed short [int]
// 有符号短整型 -
unsigned short [int]
// 无符号短整型
标准整型 (Integer)
-
int
-
signed int
// 有符号整型 -
unsigned int
// 无符号整型
长整型 (Long Integer)
-
long [int]
-
signed long [int]
// 有符号长整型 -
unsigned long [int]
// 无符号长整型
超长整型 (Long Long Integer) - C99引入
-
long long [int]
-
signed long long [int]
// 有符号超长整型 -
unsigned long long [int]
// 无符号超长整型
三、浮点型 (Floating-Point Types)
-
float
// 单精度浮点型 -
double
// 双精度浮点型 -
long double
// 扩展精度浮点型
四、布尔类型 (Boolean Type)
C语言最初没有专门的布尔类型,而是使用整数0表示假,非零值表示真。C99标准引入了专门的布尔类型。
布尔类型使用说明:
-
基本类型:
_Bool
-
需要包含头文件:
<stdbool.h>
-
取值:
-
true
(真) -
false
(假)
-
标准库定义:
#define bool _Bool
#define false 0
#define true 1
代码示例:
#include <stdbool.h>
#include <stdio.h>int main()
{_Bool flag = true; // 也可以使用 bool flag = true;if (flag) {printf("I like C\n");}return 0;
}
注意:
在实际编程中,建议使用bool
而不是直接使用_Bool
,因为前者更具可读性且是标准推荐用法。
五、各种数据类型的长度
每一种数据类型都有自己特定的长度,使用不同的数据类型可以创建不同长度的变量。变量长度的不同直接决定了其能够存储的数据范围。
sizeof 操作符
sizeof
是C语言中的一个关键字,同时也是一种操作符,专门用于计算其操作数的类型长度,单位是字节。
基本语法
sizeof
操作符的操作数可以是:类型、变量、表达式
语法形式:
sizeof(类型)
sizeof 表达式
当操作数不是类型而是表达式时,可以省略后面的括号。
重要特性
-
sizeof
后面的表达式不会真实参与运算,仅根据表达式的类型来确定大小 -
sizeof
的计算结果是size_t
类型 -
sizeof
在编译期间就完成计算,不会在运行时执行表达式
关于 size_t 类型
C语言规定 sizeof
的返回值是无符号整数,但没有规定具体类型,这由系统决定。不同系统中返回值可能是:
-
unsigned int
(对应printf
占位符%u
) -
unsigned long
(对应%lu
) -
unsigned long long
(对应%llu
)
为保证可移植性,C语言提供了 size_t
类型别名来统一表示 sizeof
的返回值类型。在 printf
中应使用 %zd
格式说明符。
示例代码
#include <stdio.h>int main()
{int a = 10;printf("%zd\n", sizeof(a)); // 变量printf("%zd\n", sizeof a); // 括号可省略printf("%zd\n", sizeof(int)); // 类型printf("%zd\n", sizeof(3 + 3.5));// 表达式return 0;
}
基本数据类型长度
以下代码展示了各种基本数据类型在典型系统(VS2022 X64配置)中的长度:
#include <stdio.h>int main()
{printf("%zd\n", sizeof(char)); // 1printf("%zd\n", sizeof(_Bool)); // 1printf("%zd\n", sizeof(short)); // 2printf("%zd\n", sizeof(int)); // 4printf("%zd\n", sizeof(long)); // 4printf("%zd\n", sizeof(long long)); // 8printf("%zd\n", sizeof(float)); // 4printf("%zd\n", sizeof(double)); // 8printf("%zd\n", sizeof(long double));// 8return 0;
}
在VS2022 X64配置下的输出:
sizeof 不计算表达式
sizeof
的一个重要特性是它不会实际计算表达式的内容,仅分析其类型:
#include <stdio.h>int main()
{short s = 2;int b = 10;printf("%d\n", sizeof(s = b + 1)); // 只考虑s的类型,不执行赋值printf("s = %d\n", s); // s的值仍为2return 0;
}
原理说明:
sizeof
在编译阶段就根据表达式的类型确定了结果,而表达式的执行是在程序运行时进行的。由于 sizeof
在编译阶段就已经处理完成,因此在运行时不会执行其中的表达式。