Skip to content

数据类型

数据类型介绍

数据类型:c 语言中数据类型有 3 种,分别是基本数据类型、构造数据类型、指针数据类型。

数据类型的作用:编译器预算数据分配的内存空间大小。

ps:可以通俗理解为:数据类型是用来规范内存的开销,约定数据在内存中的格式,便于存储。

变量

变量的语法

在计算机程序中,变量是用来存储数据的一个内存区域,并用一个名字来表示这个区域。

使用特点

  • 变量在使用前必须先定义,定义变量前必须有相应的数据类型;
  • 在程序运行过程中,其值可以改变;

语法说明

c
#include <stdio.h>

int main() {
    // 1. 定义 1 个 int 变量 age 同时赋值为 18(这叫初始化),然后打印内容
    int age = 18;
    printf("%d\n", age);

    // 2. 修改 age 的内容为 20,然后打印内容
    age = 20;
    printf("%d\n", age);

    // 3. 定义 2 个 int 变量,然后在分别赋值,然后再打印内容
    int a, b;
    a = 123;
    b = 256;
    printf("%d\n", a);
    printf("%d\n", b);

    // 4. 定义 1 个 float 类型变量 height 同时赋值,然后打印内容
    float height = 1.77;
    printf("%f\n", height);

    return 0;
}

标识符

但变量名字大家需要注意,变量名也叫 标识符,它是用户编程时起的一个名字(变量、函数、结构体等都需要名字),为了便于后面程序中的使用,有一些命名规范我们需要遵守。

命令规则

  • 只能由字母、数字、下划线_组成;
  • 不能使用数字开头;
  • 不能使用关键字;
  • 变量名之间大小写是区分的;

命令规范

好的命名习惯要做到见名知意,如下:

  • 大驼峰

    每个单词首字母大写,例如:MyFirstName

  • 小驼峰

    第二个单词开始首字母大写,例如:myFirstName

  • 下划线命名

    每个单词之间使用下划线连接,例如:my_first_name

示例

背景: 班长家的房子是一个价值千万的四层别墅,别墅的房间有很多、各种家居也非常多。他所住的房间是在三楼东边的卧室,房间里有学习桌和座椅,座椅非常豪华,有 2.5 米高,价值一万多块。 请为班长的座椅起个名字,要求看到名字就知道是哪个座椅。

例如:

  • ThirdFloorEastRoomSeat
  • thirdFloorEastRoomSeat
  • third_floor_east_room_seat

char 类型

char 表示为字符类型,用于存储单个字符,每个字符变量都是由 8 个 bit 位构成,在内存中就是 1 个字节。

相关特性:

  • 在给字符型变量赋值时,需要用一对英文半角格式的单引号(' ') 把字符括起来。

  • 字符变量在内存单元存储时,是将与该字符对应的 ASCII 码放到变量的存储单元中。

  • char 的本质就是一个 1 个字节大小的整型。 示例代码:

c
#include <stdio.h>

int main() {
    // 定义一个 char 类型变量,同时赋值为 97,分别用 %d,%c 打印结果
    char ch = 97;
    printf("%d\n", ch);
    printf("%c\n", ch);

    // 定义一个 char 类型变量,同时赋值为 'a',分别用 %d,%c 打印结果
    char ch2 = 'a';
    printf("%d\n", ch2);
    printf("%c\n", ch2);

    return 0;
}

布尔类型

布尔类型是一种处理逻辑的类型,其有两个值,分别是真(true)或假(false),它在内存中的长度一般只占用 1 个字节。

  • 早期 C 语言没有布尔类型数据,以 0 代表逻辑假,非 0 代表逻辑真;
  • C99 标准定义了新的关键字 _Bool,提供了布尔类型,或者也可以使用 stdbool.h 中的 bool;

示例代码:

c
#include <stdio.h>
#include <stdbool.h>

int main() {
    // 定义一个 bool 类型变量,同时赋值为 true,然后打印变量的值
    bool flag = true;
    printf("%d\n", flag);

    // 修改上一步变量的值为 false,然后打印变量的值
    flag = false;
    printf("%d\n", flag);

    return 0;
}

数据类型长度

存储单位说明

术语含义
bit(比特)一个二进制代表一位,一个位只能表示 0 或 1 两种状态。
数据传输是习惯以“位”(bit)为单位。
Byte(字节)一个字节为 8 个二进制,称为 8 位,计算机中存储的最小单位是字节。
数据存储是习惯以“字节”(Byte)为单位。
1b1bit
1B1Byte = 8bit
1KB1KB = 1024B
1MB1MB = 1024KB
1GB1GB = 1024MB
1TB1TB = 1024GB
1PB1PB = 1024TB
…………

问题:班长家的大别墅装了一个千兆光纤,请帮班长计算一下,班长的网速最高可以达到多少?

基本数据类型长度

数据类型的长度会受操作系统平台的影响,所以在不同平台下基本数据类型的长度是不一样的。

示例代码:

c
#include <stdio.h>

int main() {
    // 通过 sizeof 打印各种类型的长度 (大小)
    printf("char length = %d\n", sizeof(char));
    printf("short length = %d\n", sizeof(short));
    printf("int length = %d\n", sizeof(int));
    printf("long length = %d\n", sizeof(long));
    printf("float length = %d\n", sizeof(float));
    printf("double length = %d\n", sizeof(double));
    printf("long double length = %d\n", sizeof(long double));

    // 定义 int 类型变量,sizeof 打印变量的大小
    int a;
    printf("a length = %d\n", sizeof(a));

    return 0;
}

ps:在单片机开发中,int 在 8 位的单片机中长度为 2 个字节,在 32 位的单片机中长度为 4 个字节。

可移植的类型

最开始我们介绍 C 语言是一门跨平台的编程语言,使用 C 语言编写的程序可以在不同的系统平台下运行,这里有一些前提, 为了更好的兼容不同平台,我们在使用基本上数据类型的时候会采用可移植的类型,这些类型可以确保在不同的平台下稳定的运行。

C 语言在可移植类型头文件 stdint.hinttype.h 中规定了精确宽度整数类型,以确保 C 语言的类型在各系统内功能相同。

示例代码:

c
#include <stdio.h>
#include <inttypes.h>

int main() {
    // 8 位整型
    int8_t a = 127;
    printf("%d\n", sizeof(a));

    // 16 位整型
    int16_t b = 127;
    printf("%d\n", sizeof(b));

    // unsigned 无符号,没有符号位,数值为正数
    uint8_t c = 255;
    uint16_t d = 200;

    return 0;
}

常量

与变量不同,常量的值在程序运行时不会改变。

类型
整型常量100,200,-100,0
实型常量3.14,0.125,-3.123
字符型常量'a', 'b', '1'
字符串常量"a", "ab","12356"

自定义的常量

常量的定义方式有两种:

c
// 预处理 (类似常量,结尾不能加分号;)
#define PI 3.14

// const 常量
const double pi2 = 3.14;

示例代码:

c
#include <stdio.h>
// 预处理常量
#define PI 3.14

int main() {
    // const 常量
    const double pi2 = 3.14;

    // 常量不能修改,以下代码是错误的
    // PI = 3.33;
    // pi2 = 3.33;

    return 0;
}

系统定义的常量

C 语言提供了一些常量库,比如有:float.hlimits.h 等,这些常量同样受操作系统平台的影响会在不同的平台下不一样。

float.h:

limits.h:

示例代码:

c
#include <stdio.h>
#include <float.h>
#include <limits.h>

int main() {
    // 打印 float 类型能够表示的最大值和最小值
    printf("%lf\n", FLT_MIN);
    printf("%lf\n", FLT_MAX);
    // 打印 char 类型位数以及能够表示的最大值和最小值
    printf("%d\n", CHAR_BIT);
    printf("%d\n", CHAR_MIN);
    printf("%d\n", CHAR_MAX);
    // 打印 short 类型能够表示的最大值和最小值
    printf("%d\n", SHRT_MIN);
    printf("%d\n", SHRT_MAX);
    // 打印 int 类型能够表示的最大值和最小值
    printf("%d\n", INT_MIN);
    printf("%d\n", INT_MAX);
    // 打印 long 类型能够表示的最大值和最小值
    printf("%ld\n", LONG_MIN);
    printf("%ld\n", LONG_MAX);

    return 0;
}