基本类型
- C语言的基本数据类型分为两大类:整数类型和浮点数类型。不同的种类提供了不同的范围和精度。
- 关键字
1. 创建基本数据类型要用到8个关键字:int、long、short、unsigned、char、float、double、signed(ANSI C)。 - 有符号整数
1. 有符号整数可以具有正值或负值。
2. int是所有系统中基本整数类型。
3. long或long int可储存的整数应大于或等于int可储存的最大数;long至少是32位。
4. short或short int整数应小于或等于int可储存的最大数;short至少是16位。通常,long比short大。
例如,在PC中的C DOS编译器提供16位的short和int、32位的long。这完全取决于系统。
7. C99标准提供了long long类型,至少和long一样大,至少是64位。 - 无符号整数
无符号整数只有 0 和正值,这使得该类型能表示的正数范围更大。在所需的类型前面加上关键字unsigned:unsigned int、unsigned long、unsignedshort、unsigned long long。单独的unsigned相当于unsigned int。 - 字符
1. 字符是如A、&、+这样的印刷符号。根据定义,char类型的变量占用1字节的内存。过去,char类型的大小通常是8位。然而,C在处理更大的字符集时,char类型可以是16位,或者甚至是32位。
2. 这种类型的关键字是char。一些实现使用有符号的char,但是其他实现使用无符号的char。ANSI C允许使用关键字signed 和 unsigned指定所需类型。从技术层面上看,char、unsigned char和signed char是3种不同的类型,但是char类型与其他两种类型的表示方法相同。 - 布尔类型(C99)
1. _Bool是C99新增的布尔类型。它一个无符号整数类型,只能储存0(表示假)或1(表示真)。包含stdbool.c头文件后,可以用bool表示_Bool、ture表示1、false表示0,让代码与C++兼容。 - 实浮点数和复浮点数类型
1. C99识别两种浮点数类型:实浮点数和复浮点数。浮点类型由这两种类型构成。
2. 实浮点数可以是正值或负值。C识别3种实浮点类型。float是系统中的基本浮点类型。它至少可以精确表示6位有效数字,通常float为32位。
3. double(可能)表示更大的浮点数。它能表示比 float更多的有效数字和更大的指数。它至少能精确表示10位有效数字。通常,double为64位。
4. long double(可能)表示更大的浮点数。它能表示比double更多的有效数字和更大的指数。复数由两部分组成:实部和虚部。C99 规定一个复数在内部用一个有两个元素的数组表示,第 1 个元素表示实部,第2个元素示虚部。有3种复浮点数类型。
5. float _Complex表示实部和虚部都是float类型的值。
6. double _Complex表示实部虚部都是double类型的值。
7. long double _Complex表示实部和虚部都是long double类型的值。每种情况,前缀部分的类型都称为相应的实数类型(corresponding realtype)。例如,double是double_Complex相应的实数类型。C99中,复数类型在独立环境中是可选的,这样的环境中不需要操作系统也可运行C程序。在C11中,复数类型在独立环境和主机环境都是可选的。
8. 有 3 种虚数类型。它们在独立环境中和主机环境中(C 程序在一种操作系统下运行的环境)都是可选的。虚数只有虚部。这3种类型如下。
9. float _Imaginary表示虚部是float类型的值。
10 double _Imaginary表示虚部是double类型的值。
11. long double _Imaginary表示虚部是long double类型的值。可以用实数和I值来初始化复数。I定义在complex.h头文件中,表示
12. i(即-1的平方根)。
13. #include <complex.h> // I定义在该头文件中
14 double _Complex z = 3.0; // 实部 = 3.0,虚部 = 0
15. double _Complex w = 4.0 * I; // 实部 = 0.0,虚部 = 4.0
16. double Complex u = 6.0 – 8.0 * I; //实部= 6.0,虚部 = -8.0
前面章节讨论过,complex.h库包含一些返回复数实部和虚部的函数。
存储类别
- 变量的存储类别取决于它的作用域、链接和存储期。存储类别由声明变量的位置和与之关联的关键字决定。定义在所有函数外部的变量具有文件作用域、外部链接、静态存储期。声明在函数中的变量是自动变量,除非该变量前面使用了其他关键字。它们具有块作用域、无链接、自动存储期。以static关键字声明在函数中的变量具有块作用域、无链接、静态存储期。以static关键字声明在函数外部的变量具有文件作用域、内部链接、静态存储期。
- C11 新增了一个存储类别说明符:_Thread_local。以该关键字声明的对象具有线程存储期,意思是在线程中声明的对象在该线程运行期间一直存在,且在线程开始时被初始化。因此,这种对象属于线程私有。
- 注意,关键字extern只能用来再次声明在别处已定义过的变量。在函数外部定义变量,该变量具有外部链接属性。
- 除了以上介绍的存储类别,C 还提供了动态分配内存。这种内存通过调用 malloc()函数系列中的一个函数来分配。这种函数返回一个可用于访问内存的指针。调用 free()函数或结束程序可以释放动态分配的内存。任何可以访问指向该内存指针的函数均可访问这块内存。例如,一个函数可以把这个指针的值返回给另一个函数,那么另一个函数也可以访问该指针所指向的内存。
摘自:CP6