内容纲要

数据类型

分类

  • 基本数据类型
    • 整数类型
    • 浮点类型
    • 字符类型
  • 构造数据类型
    • 数组型
    • 结构型
    • 共用型
  • 指针类型
  • 枚举类型
  • 空类型

整数类型

类型关键字 类型 字节数 值范围
int 整型 4 字节 -2,147,483,648 ~ 2,147,483,647即-231~(231-1)
unsigned int 无符号整型 4 字节 0 ~ 4,294,967,295即0 ~ (232-1)
short 短整型 2 字节 -32,768 ~ 32,767即-215 ~ (215-1)
unsigned short 无符号短整型 2 字节 0 ~ 65,535即0 ~ (216-1)
long 长整型 4 字节 -2,147,483,648 ~ 2,147,483,647即-231 ~ (231-1)
unsigned long 无符号长整型 4 字节 0 ~ 4,294,967,295即0 ~ (232-1)

浮点类型

类型关键字 类型 字节数 值范围 精度
float 单精度浮点型 4 字节 1.2E-38 ~ 3.4E+38 6 位小数
double 双精度浮点型 8 字节 2.3E-308 ~ 1.7E+308 15 位小数
long double 多精度浮点型 16 字节 3.4E-4932 ~ 1.1E+4932 19 位小数

字符类型

类型关键字 类型 字节数 值范围
char 字符型 1 字节 -128 ~ 127或0 ~ 255
unsigned char 无符号字符型 1 字节 0 ~ 255
signed char 有符号字符型 1 字节 -128 ~ 127

常量

在程序执行过程中,其值不发生变化的量称为常量,又称为字面量。

符号常量

用标识符表示一个常量。

定义方式如下:

#define 标识符 常量

#define是一条预处理命令,称为宏定义,把表示符定义为其后的常量值。定义后,在程序中所有出现标识符的地方均以常量值代替。习惯上将符号常量的标识符用大写字母,变量标识符用小写字母。

#include <stdio.h>
#define MAXSIZE 255

整型常量

类型 定义
二进制整型 0b101或0B101
八进制整型 017
十进制整型 6
十六进制整型 0x10或者0X10
无符号整型 20u或者20U
长整型 20l或者20L
无符号长整型 20ul或者20UL

后缀或前缀字母可大写可小写

浮点型常量

类型 定义
十进制小数 30.2
指数 3.2e-3或3.2E-3(科学计数法表示3.2*10-3)
单精度浮点型 30.134f或30.134F
双精度浮点型 30.2或30.2d或30.2D

浮点数默认为双精度浮点型

字符常量

字符常量是括在单引号中,存储在char类型。

类型 定义 含义
普通字符 ‘a’
Unicode编码 ‘\u0ac1’ 用\u后跟十六进制数代表字符的Unicode编码值
转义字符 \\ \ 字符
\’ ‘ 字符
\" "字符
\? ? 字符
\a 警报铃声
\b 退格键
\f 换页符
\n 换行符
\r 回车
\t 水平制表符
\v 垂直制表符
\ooo 一到三位的八进制数
\xhh . . . 一个或多个数字的十六进制数

字符串常量

通常用""来包括普通字符、转义字符。

类型 定义
字符串常量 "sfafa"

字符串默认是以\0来表示结束的,如"123""123\0"效果一样,系统默认在其后追加"\0"

定义方式

使用const关键字来定义

#include <stdio.h>

int main()
{
    const char A = 'a';
    const int B = 10;
    return 0;
}

变量

在程序执行过程中,其值可变的量称为变量。变量具有变量名,在内存中占据一定的存储单元,必须在使用变量前进行定义。

定义

数据类型 变量名;

同时定义和声明,在声明时已经建立存储空间。

声明

extern 数据类型 变量名;

使用存储类extern光声明未定义,不需要建立存储空间。

用法一:声明局部变量为全局变量

#include <stdio.h>
//函数外定义全局变量
int x,y;

int add(){
    //函数内声明变量为全局变量
    extern int x,y;
    x = 1;
    y = 1;
    return x + y;
}

int main()
{

    printf("%d",add());
    return 0;
}

用法二:一个文件引用另一个文件的变量

demo.c

#include <stdio.h>
//函数外声明全局变量
extern int x,y;

int add(){
    return x + y;
}

main.c

#include <stdio.h>
#include "demo.c"
//函数外定义全局变量并初始化
int x = 1,y = 1;

int main()
{
    printf("%d",add());
    return 0;
}

运行结果为2,先在一个文件中预先声明两个全局变量,然后在另一个文件中初始化定义。

存储类

存储类定义 C 程序中变量/函数的范围(可见性)和生命周期,通常放置在它们所修饰的类型之前。

  1. auto只能修饰局部变量,即只能在函数内使用,是所有局部变量的默认存储类。
void main(){
    int a;
    auto int a;
}
  1. register用于定义存储在寄存器中而不是 RAM中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的 ‘&’ 运算符(因为它没有内存位置)。寄存器只用于需要快速访问的变量,比如计数器。还应注意的是,定义 ‘register’ 并不意味着变量将被存储在寄存器中,它意味着变量可能存储在寄存器中,这取决于硬件和实现的限制。
  2. static用于静态变量,修饰全局变量时,使变量的作用域限制在声明它的文件内,可以被任何函数调用。修饰局部变量是,可以在不同函数调用之间保持局部变量的值,在离开作用域时不需要销毁。
  3. extern如上所示

初始化

类型 实例
初始化 变量名 = 值;
声明并初始化 extern 数据类型 变量名 = 值;
定义声明并初始化 数据类型 变量名 = 值;
  • float类型的变量前6位数字一定是有效的,其能保证的有效数字通常是6~7位,后面数字无意义。要避免将大的浮点数与小的浮点数进行运算,将会损失精度。

  • char类型使用一个字节,通常是整数类型,可以和整数类型一样进行运算,但不可取模。

  • void表示类型的缺失

  • 整型变量在超过最大值范围,就会发生溢出,达到最大值之后,又开始从最小值进行计数。

数据类型转换

自动数据类型转换

自动类型转换

  1. 若参与运算的变量类型不同,则先转换成同一类型进行运算。
  2. 转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。
    • 若两种类型的字节数不同,转换成字节数高的类型
    • 若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型
  3. 所有的浮点运算都是以双精度进行的,即使是两个float单精度变量运算的表达式,也要先转换成double型,再作运算。
  4. char型和short型参与运算时,必须先转换成int型。
  5. 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部分直接舍弃。如将浮点型数据赋值给整型变量时。
#include <stdio.h>

int main()
{
        float a = 2.89;
        int b;
        b = a;
        printf("b=%d\n",b);
        printf("a=%f\n",a);

        return 0;
}
b=2
a=2.890000
  1. 将double型数据赋值float型变量时,截取前面7位有效数字,存放到float里,并且double型数据不能超过float型的范围。
#include <stdio.h>

int main()
{
        double a = 12345.6789;
        float b;
        b = a;
        printf("b=%f\n",b);
        printf("a=%lf\n",a);

        return 0;
}
b=12345.678711
a=12345.678900
  1. 将一个intshortlong型数据赋给一个char型变量,只将其低8位原封不动的送到char型变量。
#include <stdio.h>

int main()
{
        int a = 289;//二进制0000 0001 0010 0001
        char b;
        b = a;
        printf("b=%d\n",b);//二进制0010 0001 十进制33
        printf("a=%d\n",a);

        return 0;
}
b=33
a=289
  1. 将unsigned型数据赋给一个占字节数相同的非unsigned型变量时,将unsigned型变量的内容送到signed数据型变量中,如果数据范围超过相应整型范围,会出现数据错误。
#include <stdio.h>

int main()
{
        unsigned int a;
        int b = -1;
        a = b;
        printf("b=%d\n",b);
        printf("a=%u\n",a);
        return 0;
}

结果如下:

b=-1
a=4294967295

强制数据类型转换

将表达式转换为指定的数据类型

格式:

(数据类型) 表达式

例如:

double b = 151.12;
int a = (int)b;
最后修改日期: 2020年11月27日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。