Skip to content

数据类型

在C语言中,数据类型决定了变量可以存储什么类型的数据,以及如何存储这些数据。不同的数据类型占用不同大小的内存空间,并且支持不同的操作。在本章节中,我们将介绍C语言的各种数据类型。

1. 数据类型的分类

C语言的数据类型可以分为以下几类:

  1. 基本数据类型:包括整型、浮点型和字符型
  2. 派生数据类型:包括数组、指针、结构体、共用体等
  3. 枚举类型:一种特殊的整型
  4. 空类型:void

2. 基本数据类型

2.1 整型

整型用于存储整数,包括以下几种类型:

类型说明大小(字节)取值范围
char字符型(本质上是小整型)1-128 到 127
signed char有符号字符型1-128 到 127
unsigned char无符号字符型10 到 255
short短整型2-32768 到 32767
unsigned short无符号短整型20 到 65535
int整型4-2147483648 到 2147483647
unsigned int无符号整型40 到 4294967295
long长整型4 或 8取决于系统
unsigned long无符号长整型4 或 8取决于系统
long long长长整型8-9223372036854775808 到 9223372036854775807
unsigned long long无符号长长整型80 到 18446744073709551615

2.2 浮点型

浮点型用于存储带有小数点的数值,包括以下几种类型:

类型说明大小(字节)精度
float单精度浮点型4约7位小数
double双精度浮点型8约15位小数
long double长双精度浮点型8 或 16取决于系统

2.3 字符型

字符型用于存储单个字符,使用char类型:

c
char ch = 'A';  // 存储字符A
char symbol = '@';  // 存储符号@

在C语言中,字符实际上是存储为ASCII码值的,例如:

c
char ch = 'A';  // 实际上存储的是ASCII码值65
printf("%c\n", ch);  // 输出字符A
printf("%d\n", ch);  // 输出ASCII码值65

3. 派生数据类型

3.1 数组

数组是相同类型元素的集合,例如:

c
int numbers[5];  // 存储5个整数的数组
char name[10];  // 存储10个字符的数组

3.2 指针

指针是存储内存地址的变量,例如:

c
int *p;  // 指向整型变量的指针
char *str;  // 指向字符的指针

3.3 结构体

结构体是不同类型元素的集合,例如:

c
struct Person {
    char name[50];
    int age;
    float height;
};

3.4 共用体

共用体是一种特殊的数据类型,允许在同一块内存中存储不同类型的数据,例如:

c
union Data {
    int i;
    float f;
    char str[20];
};

3.5 函数

函数也是一种派生数据类型,例如:

c
int add(int a, int b) {
    return a + b;
}

4. 枚举类型

枚举类型是一种特殊的整型,用于定义一组命名的常量,例如:

c
enum Weekday {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
};

默认情况下,枚举常量的值从0开始,依次递增。你也可以显式指定枚举常量的值:

c
enum Color {
    RED = 1,
    GREEN = 2,
    BLUE = 4
};

5. 空类型

空类型void表示没有值或类型,主要用于:

  1. 函数返回类型:表示函数不返回任何值
  2. 函数参数:表示函数不接受任何参数
  3. 指针类型:表示通用指针

例如:

c
void print_hello() {
    printf("Hello!\n");
}

void *ptr;  // 通用指针

6. 类型修饰符

C语言提供了一些类型修饰符,可以修改基本数据类型的行为:

6.1 signed

表示有符号类型,可以存储正数、负数和零。对于整型,signed是默认的。

c
signed int x = -10;  // 可以存储负数

6.2 unsigned

表示无符号类型,只能存储非负数。

c
unsigned int y = 10;  // 只能存储非负数

6.3 short

表示短整型,占用较少的内存空间。

c
short int z = 1000;  // 短整型

6.4 long

表示长整型,占用较多的内存空间。

c
long int big_num = 1000000;  // 长整型

7. 数据类型的大小

可以使用sizeof运算符来获取数据类型或变量占用的字节数:

c
printf("Size of int: %zu bytes\n", sizeof(int));
printf("Size of float: %zu bytes\n", sizeof(float));
printf("Size of double: %zu bytes\n", sizeof(double));
printf("Size of char: %zu bytes\n", sizeof(char));

8. 数据类型的选择

在选择数据类型时,应考虑以下因素:

  1. 数据范围:确保所选类型能够容纳可能的最大值和最小值
  2. 内存空间:在不需要大空间时,选择较小的类型以节省内存
  3. 精度要求:对于需要高精度的计算,选择双精度浮点型
  4. 性能:某些类型的操作可能比其他类型更快

8.1 示例

  • 存储年龄:使用unsigned charunsigned short(范围足够且节省空间)
  • 存储工资:使用floatdouble(需要小数)
  • 存储大整数:使用longlong long(范围更大)

9. 示例:综合运用

现在,让我们看一个综合运用各种数据类型的例子:

c
#include <stdio.h>

// 枚举类型:月份
enum Month {
    JANUARY = 1,
    FEBRUARY,
    MARCH,
    APRIL,
    MAY,
    JUNE,
    JULY,
    AUGUST,
    SEPTEMBER,
    OCTOBER,
    NOVEMBER,
    DECEMBER
};

// 结构体类型:日期
struct Date {
    int day;
    enum Month month;
    int year;
};

// 结构体类型:学生
struct Student {
    char name[50];
    int id;
    float gpa;
    struct Date birthday;
};

int main() {
    // 基本数据类型
    char grade = 'A';
    int age = 20;
    float height = 1.75;
    double weight = 65.5;
    
    // 枚举类型
    enum Month current_month = MARCH;
    
    // 结构体类型
    struct Date today = {15, MARCH, 2024};
    
    // 结构体类型:学生
    struct Student student = {
        "John Doe",
        12345,
        3.8,
        {1, JANUARY, 2004}
    };
    
    // 输出信息
    printf("Grade: %c\n", grade);
    printf("Age: %d\n", age);
    printf("Height: %.2f meters\n", height);
    printf("Weight: %.1f kg\n", weight);
    printf("Current month: %d\n", current_month);
    printf("Today's date: %d/%d/%d\n", today.day, today.month, today.year);
    printf("Student name: %s\n", student.name);
    printf("Student ID: %d\n", student.id);
    printf("Student GPA: %.2f\n", student.gpa);
    printf("Student birthday: %d/%d/%d\n", student.birthday.day, student.birthday.month, student.birthday.year);
    
    return 0;
}

小结

C语言提供了丰富的数据类型,包括:

  1. 基本数据类型:整型、浮点型和字符型
  2. 派生数据类型:数组、指针、结构体、共用体等
  3. 枚举类型:用于定义命名常量
  4. 空类型:void

选择合适的数据类型对于编写高效、正确的程序非常重要。在后续章节中,我们将学习如何使用变量来存储这些不同类型的数据。