类型系统与C语言类型转换
目录

1. 类型系统

在计算机中,任何数值都是以一组比特组成的,硬件无法分辨这些比特的意义。 类型系统赋予一组比特具体的含义,定义其类型,告知程序怎样对待这些比特。 类型系统提供的功能主要有:安全性、优化、可读性和抽象化。 每种语言都有一个特定的类型系统,保证程序的表现良好,并且排除非法的行为。

1.1 静态类型检查与动态类型检查

类型检查所进行的检查处理以及实行类型的约束,可发生在编译时期(静态检查)运行时期(动态检查)

静态类型检查是在编译器所进行语义分析中进行的。静态类型检查通常能增进最终程序的可靠性。

动态类型检查是在运行时期进行类型标记的检查。动态类型检查通常能加快编译速度。

1.2 强类型与弱类型

强类型是指这门语言检查两种类型是否兼容,如果不兼容则会抛出一个错误或强制类型转换,尽管上述说法不是很严格。 如果禁止类型转换参与运算,如数字字符串加上数字是错误的,那么其就是强类型。

1.3 静态语言与动态语言

动态编程语言是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。 大部分动态语言都使用动态类型,但也有些不是。

静态类型语言强迫在类型结构的基础上执行多态。 判断是否是一只鸭子的依据是其基因蓝图(静态) ,还是因其叫声和走路的姿态像一只鸭子(动态)。 (《七周七语言》)

以上三组术语都没有严格的定义,现实中经常混用。

2. C 语言类型转换

C语言(几乎)是一个强类型语言(C is (partly) a strongly typed language)。 说是强类型语言也就是说每个变量、函数调用和常量在编译时都会强制赋予类型。 说是几乎是因为C语言编译器的类型检查一般很弱,并且允许自动类型转换。

(《七周七语言》里说C是弱类型,因为编译器并不关心在某一内存位置上的数据到底是一个整数、一个字符串还是只是一个普通数据。)

2.1 自动转换 automatical conversion

2.1.1 算术转换

进行算术运算(加、减、乘、除、取余以及符号运算)时,不同类型数招必须转换成同一类型的数据才能运算。 转换的优先级是:

double ←── float 优先级高
↑
long
↑
unsigned
↑
int ←── char,short 优先级低

2.1.2 赋值转换

进行赋值操作时,赋值运算符右边的数据类型必须转换成赋值号左边的类型,若右边的数据类型的长度大于左边,则要进行截断或舍入操作。

转换的规则有(注意数据在内存中以补码形式存储):

  • 实型附给整型时,舍弃小数部分。
  • 整形附给实型时,添加小数部分(补0)。
  • 长度大的整型附给长度小的整形时,只截取其低n位,即截断。
  • 长度大的实型附给长度小的实型时,只截取其前n个有效位。
  • 无符号附给有符号,原样拷贝(包括符号位)。
  • 有符号附给无符号,原样拷贝(包括符号位)。

以上转换都可能出现溢出问题。

赋值转换也包括拷贝赋值,比如实参传给行参,函数返回等。

2.2 强制转换 Cast

对于可能产生数据错误的类型转换(如溢出),需要提供显示的类型转换标志,即强制类型转换。

强制类型转换的语法是:(T)expression

这也使得编译器对于expression禁止warning类型警告。

发表评论