3月22日参加面试的一个笔试题
题目如下:
下面代码的输出结果是什么?为什么会输出这样的结果?
- unsigned int a = 6;
- int b = -20;
- 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位))。
阅读(1112) | 评论(0) | 转发(0) |