C语言中的类型转换
C语言中的类型转换有两种,自动与强制。
它们都有几种情况,如不同长度的转换;不同类型的转换;还有无符号与有符号数之间的转换。关键是两点,即长度不同时如何转换,在有无符号数参与时如何转换。
一般的处理方式是长变短时作一个简单的截短操作,内存的对齐方式影响这个结果。短的变长时,与符号有关,如果是有符号数,则有两种可能,符号扩展或简单地提升(即高位补0)。这个C标准没有定义,取决于编译器。所以,在将短的数据转换为长的数据时,最好是用强制的转换。无符号数就没关系了,结果是一样的。
1.强制类型转换
具体形式如下:
(类型)表达式
这个出错的机会比较小一点,因为由程序员自己控制。但要注意的,在对指针转换时,如果将一个
指向一个较小内存单元的指针转换为一个指向较大内存单元的指针,就会破坏其它内存单元的数据。
这个在自动转换中也有,故在下面一起描述。强制转换一般是在将一个空指针赋给一个在类型的指针
时的操作,如在malloc()操作时。
2.自动类型转换
这是最容易出错的,因为C语言对类型的检查比较少,这样设计的好处是给程序员提供编程上的方便,但任何事情都有两面性,自动类型转换有不少副作用。我们先来看一下自动转换在什么时候发生:
1)表达式求值
2)赋值
3)函数调用
这几种转换的细节都可以参考《C程序设计语言》(The C Programming Language, Brian
W.Kernighan, Dennis M.Ritchie)
一是有无符号数参与的表达式计算
C语言中对这个没有规定,取决于实现。看下面这个例子:
#include
int main(void)
{
long a;
unsigned short b;
unsigned long c, d;
short e;
a = -1L;
b = 1U;
d = a &#