Chinaunix首页 | 论坛 | 博客
  • 博客访问: 836605
  • 博文数量: 190
  • 博客积分: 2991
  • 博客等级: 少校
  • 技术积分: 2400
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-24 18:11
文章分类

全部博文(190)

文章存档

2015年(3)

2014年(1)

2013年(65)

2012年(121)

我的朋友

分类: IT职场

2013-04-14 19:04:48

当运算符的几个操作数类型不同时,编译器会通过一些规则来把它们转换为某种相同的类型。
 
1.自动转换(隐式类型转换)
如果没有进行强制类型转换,默认为自动转换。
当一个运算符的几个操作数类型不同时,自动转换的原则是将“比较窄的”操作数转换为“比较宽的”操作数,并且不丢失信息。
特例:对于赋值运算符,赋值运算符右边的值要转换成左边变量的类型,左边变量的类型即赋值表达式结果的类型。右边的“宽”操作数转换为左边的“窄”操作数时,超出的高位部分直接被丢弃。
 
1.1将字符类型转换为整型
       C语言没有指定char类型的变量是无符号变量(signed)还是带符号变量(unsigned)。在某些机器中,char类型值的最左一位为1,而在另一些机器中char类型值的最左一位为0。字符类型转换为整型时会进行“符号位扩展”。对于有符号数,用符号位填充高位字节。对于无符号数,用0填充高位。
            C语言的定义保证打印字符集中的字符总是正值。但是,存储在字符变量中的位模式在某些机器可能是负值,而在另一些机器上可能是正的。为了程序的可移植性,如果要在char类型的变量中存储非字符数据最好显示指定singned或unsigned限定符。
 
1.2有符号数和无符号数之间的转换
当操作数中既有无符号数又有有符号数时,无符号数将自动转换成有符号数再进行运算。
-1L<1U,这是因为unsigned int类型的1U被提升为singed long类型;而
-1L>1UL,这是因为-1L转换为unsignedlong类型时,最高位为1,是一个比较大的正数。
 
1.3赋值运算符的类型转换
       较长的整数转换为较短的整数或char类型时,超出的高位直接被丢弃。因此,下面的程序片段
int i;
char c;
i = c;
c = i;
i的值不会有变化。(无论是否进行符号位扩展,该结论都成立)
如果上面赋值语句的次序颠倒一下:
c=i;
i=c;
如果i是一个负数(高位为1),经过上面的赋值后高位信息将丢失,i将变成一个整数。
 
2.强制类型转换
       语法规则:(类型名)表达式
强制类型转换的规则和自动转换一样:长转短,可能丢失信息;短转长,符号位填充;
注意:强制类型转换只是生成一个指定类型的值,操作对象本身是没有什么改变的。
2.1函数参数的自动强制转换
在调用函数时,如果传入的参数和函数原型申明参数类型不一样,将进行自动强制类型转换,转换不了就报错。
PS:C语言标准库中(K&C之后的版本),没有一个函数参数是char型的。要用到char型的函数都用int代替了。所以你传入的char都会转换为int型后传入。
阅读(901) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~