基本概念
在编程语言中,最基本的、不可再分的数据类型称为基本类型(Primitive Type),例如整型、浮点型;根据语法规则由基本类型组合而成的类型称为复合类型(Compound Type),例如字符串是由很多字符组成的。有些场合下要把复合类型当作一个整体来用,而另外一些场合下需要分解组成这个复合类型的各种基本类型,复合类型的这种两面性为数据抽象(Data Abstraction)奠定了基础。
基本数据类型
C语言提供了下列几种基本数据类型:
类型 | 说明 |
---|---|
char | 字符型,占用一个字节,可以存放本地字符集中的一个字符 |
int | 整型,通常反映了所用机器中整数的最自然长度 |
float | 单精度浮点型 |
double | 双精度浮点型 |
short 与 long
short
与long
两个限定符用于限定整型
short int n;
long int m;
在上述这种类型的声明中,关键字int
可以省略 。通常很多人也习惯这么做。
short
与long
两个限定符的引入,可以为我们提供满足实际需要的不同长度的整型数。int通常代表特定机器中整数的自然长度。short类型通常为16位,long类型通常为32位,int类型可以为16位或32位。各编译器可以根据硬件特性自主选择合适的类型长度,但要遵循下列限制:short与int类型至少为16位,而long类型至少为32位,并且short类型不得长于int类型,int类型不得长于long类型。
signed 与 unsigned
类型限定符signed与unsigned可用于限定任何整型(包括char类型)。unsigned类型的数总是正值或0,并遵守算数模 2^n 定律,其中n是该类型占用的位数。例如,如果char对象占用8位,那么unsigned char类型变量的取值范围为0255,而signed char类型变量的取值范围则为 -128127(在采用对二补码的机器上)。不带限定符的char类型对象是否带符号则取决于具体机器,但可打印字符总是正值。
float, double 与 long double
long double 类型表示高精度的浮点数。同整型一样,浮点型的长度也取决于具体的实现。float、double与long double类型可表示相同的长度,也可以表示两种或三种不同的长度。
有关这些类型长度定义的符号常量以及其他与机器和编译器有关的属性可以在标准头文件limits.h
与float.h
中找到。
类型转换
自动类型转换
自动类型转换:把“比较窄的”操作数转换为“比较宽的”操作数,并且不丢失信息的转换。
针对可能导致信息丢失的表达式,编译器可能会给出警告信息,比如把较长的整型值赋给较短的整型变量,把浮点型值赋值给整型变量等等,但这些表达式并不非法。
一般来说,如果二元运算符(具有两个操作数的运算符称为二元运算符,比如+
或*
)的两个操作数具有不同的类型,那么在进行运算之前会把“较低”的类型提升为“较高”的类型,运算的结果为较高的类型。
在通常情况下,参数是通过函数原型声明的。当函数被调用时,声明将对实际参数进行自动类型转换。
强制类型转换
在任何表达式中都可以使用一个称为强制类型转换的一元运算符强制进行显式类型转换。在下列语句中,表达式将按照上述转换规则被转换为类型名指定的类型:
(type)<expr>
我们可以这样来理解强制类型转换的准确含义:在上述语句中,表达式首先被赋值给类型名指定的类型的某个变量,然后再用该变量替换上述整条语句。强制类型转换与其他一元运算符具有相同的优先级。
sizeof 运算符
sizeof 运算符可以查看一个变量/类型所占用的字节空间。
sizeof(<varible/type>)
尽可能用 sizeof(varname) 代替 sizeof(type)。使用 sizeof(varname) 是因为当代码中变量类型改变时会自动更新。某些情况下 sizeof(type) 或许有意义,但还是要尽量避免,因为它会导致变量类型改变后不能同步。
typedef 关键字
typedef
可以为某个类型起个别名。通常被用于以下三种目的:
- 为了隐藏特定类型的实现,强调使用类型的目的;
- 简化复杂的类型定义,使其更易理解;
- 允许一种类型用于多个目的,同时使的每次使用该类型的目的明确。