C语言基础数据类型与类型转换详解
基本数据类型及其存储特性
C语言中的基本数据类型在不同编译环境和硬件平台下可能具有不同的大小和取值范围。以下是主要类型及其典型表现:
- 字符型:`char` 通常占1字节,可表示为有符号(-128 到 127)或无符号(0 到 255)。使用 `signed char` 或 `unsigned char` 可明确指定符号属性。
- 短整型:`short` 一般为16位,范围为 -32,768 至 32,767;`unsigned short` 范围为 0 至 65,535。
- 整型:`int` 在32位系统中通常为32位,范围约 -2.1×10⁹ 到 2.1×10⁹;`unsigned int` 范围为 0 到 4.2×10⁹。
- 长整型:`long` 在32位系统中常为32位,而在64位系统中可能扩展至64位;`unsigned long` 同样依赖平台。
- 长长整型:`long long`(C99标准引入)至少为64位,范围从 -2⁶³ 到 2⁶³−1;其无符号版本 `unsigned long long` 范围为 0 到 2⁶⁴−1。
- 浮点型:
- `float`:单精度,有效数字约7位,范围约为 ±1.4×10⁻⁴⁵ 至 ±3.4×10³⁸。
- `double`:双精度,有效数字约15~17位,范围约 ±4.9×10⁻³²⁴ 至 ±1.8×10³⁰⁸。
- `long double`:扩展精度,具体实现因平台而异,但通常比 `double` 更大。
- 布尔类型:`_Bool` 是C99新增的布尔类型,实际使用时推荐通过 `
` 头文件定义的 `bool` 宏,配合 `true` 和 `false` 使用。 - 枚举类型:`enum` 是基于整数的用户自定义类型,用于提升代码可读性。枚举值默认从0开始递增,可显式赋值。
- void 类型:表示"无类型",主要用于函数返回值(如 `void func()`)或通用指针(如 `void*`),不指向具体数据。
变量与常量的差异
变量可在程序运行期间修改值,而常量一旦定义即不可更改。在C中可通过以下方式定义常量:
- 使用 `const` 限定符:例如 `const int MAX = 100;`。
- 使用宏定义:如 `#define PI 3.14159`,在预处理阶段替换。
类型大小查询方法
利用 `sizeof` 操作符可获取变量或类型所占用的字节数:
#include <stdio.h>
int main() {
int a;
char b;
double c;
printf("int size: %zu bytes\n", sizeof(a));
printf("char size: %zu bytes\n", sizeof(b));
printf("double size: %zu bytes\n", sizeof(c));
return 0;
}
自动类型转换规则
C语言支持隐式类型转换,常见于表达式中类型提升:
- 较小整型(如 `char`、`short`)在运算前会被自动提升为 `int`。
- 整型与浮点型混合计算时,整型将被提升为对应浮点类型。
- 枚举值在大多数情况下被视为整数,可直接参与数值运算。
- 注意:结构体、联合体等复杂类型无法进行隐式转换。
强制类型转换语法
当需要显式控制类型转换时,使用强制转换语法:`(目标类型) 表达式`。
#include <stdio.h>
int main() {
short s = 10000;
int i = (int)s; // 强制转换
char ch = 'A';
int val = (int)ch; // 显式转为整数
float f = 3.14159f;
int n = (int)f; // 截断小数部分
double d = 3.141592653589793;
float f2 = (float)d; // 精度损失
enum Color { RED, GREEN, BLUE };
enum Color col = RED;
int colorVal = (int)col;
printf("s=%d, i=%d\n", s, i);
printf("ch='%c', val=%d\n", ch, val);
printf("f=%.2f, n=%d\n", f, n);
printf("d=%.15f, f2=%.5f\n", d, f2);
printf("col=%d, colorVal=%d\n", col, colorVal);
return 0;
}
强制转换可用于指针类型间转换,如 `(void*)ptr`,但需谨慎使用以避免未定义行为。