本节书摘来自异步社区出版社《C和C++程序员面试秘笈》一书中的第1章,第1.6节,作者: 董山海,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.6 看代码写结果—有符号变量与无符号变量的值的转换
C和C++程序员面试秘笈
考点: 有符号变量与无符号变量的区别和联系
出现频率:
#include <stdio.h>
char getChar(int x, int y)
{
char c;
unsigned int a = x;
(a + y > 10)? (c = 1): (c = 2);
return c;
}
int main(void)
{
char c1 = getChar(7, 4);
char c2 = getChar(7, 3);
char c3 = getChar(7, -7);
char c4 = getChar(7, -8);
printf("c1 = %d\n", c1);
printf("c2 = %d\n", c2);
printf("c3 = %d\n", c3);
printf("c4 = %d\n", c4);
return 0;
}````
【解析】
首先说明getChar()函数的作用:它有两个输入参数,分别是整型的x和y。在函数体内,把参数x的值转换为无符号整型后再与y相加,其结果与10进行比较,如果大于10,则函数返回1,否则返回2。在这里,我们要注意:当表达式中存在有符号类型和无符号类型时,所有的操作数都自动转换成无符号类型。因此,这里由于a是无符号数,在代码第8行中,y值会首先自动转换成无符号的整数,然后与a相加,最后再与10进行比较。以下是在main函数中各调用getChar()函数的分析。
代码第14行,传入的参数分别为7和4,两个数相加后为11,因此c1返回1。
代码第15行,传入的参数分别为7和3,两个数相加后为10,因此c2返回2。
代码第16行,传入的参数分别为7和-7,-7首先被转换成一个很大的数,然后与7相加后正好溢出,其值为0,因此c3返回2。
代码第17行,传入的参数分别为7和-8,-8首先被转换成一个很大的数,然后与7相加。两个数相加后为很大的整数(差1就正好溢出了),因此c4返回1。
我们可以看到,由于无符号整数的特性,getChar()当参数x为7时,如果y等于区间[-7,3]中的任何整数值,getChar()函数都将返回2。当y的值在区间[-7,3]之外时,函数返回-1。
总之,我们在看表达式时要很小心地注意符号变量与无符号变量之间的转换、占用不同字节内存的变量之间的赋值等操作,否则可能会出现我们意想不到的结果。
【答案】
c1 = 1
c2 = 2
c3 = 2
c4 = 1`