笔试题-c语言类型转换(2012.3.23面试)

3月22日参加面试的一个笔试题
题目如下:
下面代码的输出结果是什么?为什么会输出这样的结果?

  1. unsigned int a = 6;
  2. int b = -20;
  3. cout << (a + b) > 6 ? "> 6" : "<= 6" << endl;
结果分析:
输出结果是:
    > 6
结果分析
a是unsigned int无符号类型, 而b是int类型,但a+b, 因为a与b的类型不一致,所以会发生隐式类型转换,根据转换规则:低精度类型向高精度类型转换,具体是:
----------------------------------------------------------------------
int -> unsigned int -> long -> unsigned long -> long long -> unsigned long long -> float -> double -> long double
注意,上面的顺序并不一定适用于你的机器,比如当int和long具有相同字长时,unsigned int的精度就会比long的精度高(事实上大多数针对32机的编译器都是如此)。另外需要注意的一点是并没有将char和short型写入上式,原因是他们可以被提升到int也可能被提升到unsigned int。
-----------------------------------------------------------------------
b = -20转换陈unsigned类型后,会变成一个很大的整数。所以a+b肯定要大于b;

补充:
以下两个程序片段A和B,问那个for循环能运行?
  A:
  --------------------------------------------------------------------------------
  unsigned short i;
  unsigned short index=0;
  for(i = 0; i   {
  ... ...
  }
  --------------------------------------------------------------------------------
  B:
  unsigned short i;
  unsigned lONg index=0;
  for(i = 0; i   {
  ... ...
  }
  --------------------------------------------------------------------------------
  答案是A不能进入循环,B能。原因如下:
  1、在程序片段A中,index是无符号短整型unsigned short,因此,当执行到语句 i  2、在程序片段B中,index是无符号长整型unsigned long,因此,当执行到语句 i  语句和表达式通常应该是只使用一种类型的变量和常量,但如果你使用了混合类型,C则会用一个规则集合来自动完成类型的转换。这可能很方便,但也可能很危险,尤其在你无意地混合使用了不同类型的情况下。
  隐式类型转换规则:
  C语言自动转换不同类型的行为称之为隐式类型转换 ,转换的基本原则是: 低精度类型向高精度类型转换,具体是:
  int -> unsigned int -> long -> unsigned long -> long long -> unsigned long long -> float -> double -> long double

  注意,上面的顺序并不一定适用于你的机器,比如当int和long具有相同字长时,unsigned int的精度就会比long的精度高(事实上大多数针对32机的编译器都是如此)。另外需要注意的一点是并没有将char和short型写入上式,原因是他们可以被提升到int也可能被提升到unsigned int。
  提升数据的精度通常是一个平滑无损害的过程,但是降低数据的精度可能导致真正的问题。原因很简单:一个较低精度的类型可能不够大,不能存放一个具有更高精度的完整的数据。一个1字节的char变量可以存放整数101但不能存放整数12345。当把浮点类型数据转换为整数类型时,他们被趋零截尾或舍入。
  强制类型转换:
  通常我们应该避免自动类型转换,当我们需要手动指定一个准确的数据类型时,我们可以用强制类型转换机制来达到我们的目的,使用方法很简单,在需要强制转换类型的变量或常量前面加上(type),例如(double)i; 即把变量 i 强制转换成double型。
---------------------------------------------------------------------------------------------
一个int型负数转换成一个unsigned int型数时为什么会变成一个很大的整数?这
这里涉及到整数的存储方式,整数的二进制有原码、反码、补码,
它在内存中的转换是:整形数据在内存中是以2进制数的补码存在的,
正数的原码、反码、补码都一样,而负数则不同,-3的原码是1000 0000 0000 0011(左边的第一个1表示符合位,1为负,0为正);反码是1111 1111 1111 1100(原码除符号位之外的所有为取反);补码是1111 1111 1111 1101(反码+1);输出时也按补码,所以最终二进制补码的值就是类型转换后的值,即b=65533(这是在TC2.0上的(16位))。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值