《C和C++程序员面试秘笈》——1.6 看代码写结果—有符号变量与无符号变量的值的转换

简介:

本节书摘来自异步社区出版社《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`

相关文章
|
5月前
|
C++
C++ 语言异常处理实战:在编程潮流中坚守稳定,开启代码可靠之旅
【8月更文挑战第22天】C++的异常处理机制是确保程序稳定的关键特性。它允许程序在遇到错误时优雅地响应而非直接崩溃。通过`throw`抛出异常,并用`catch`捕获处理,可使程序控制流跳转至错误处理代码。例如,在进行除法运算或文件读取时,若发生除数为零或文件无法打开等错误,则可通过抛出异常并在调用处捕获来妥善处理这些情况。恰当使用异常处理能显著提升程序的健壮性和维护性。
91 2
|
5月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
444 0
|
2月前
|
算法 安全 C++
提高C/C++代码的可读性
提高C/C++代码的可读性
70 4
|
3月前
|
IDE Java 程序员
C++ 程序员的 Java 指南
一个 C++ 程序员自己总结的 Java 学习中应该注意的点。
29 5
|
3月前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
496 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
4月前
|
C++
2合1,整合C++类(Class)代码转换为MASM32代码的平台
2合1,整合C++类(Class)代码转换为MASM32代码的平台
|
4月前
|
算法 程序员 Go
PHP 程序员学会了 Go 语言就能唬住面试官吗?
【9月更文挑战第8天】学会Go语言可提升PHP程序员的面试印象,但不足以 solely “唬住” 面试官。学习新语言能展现学习能力、拓宽技术视野,并增加就业机会。然而,实际项目经验、深入理解语言特性和综合能力更为关键。全面展示这些方面才能真正提升面试成功率。
67 10
|
3月前
|
C语言 C++
实现两个变量值的互换[C语言和C++的区别]
实现两个变量值的互换[C语言和C++的区别]
37 0
|
4月前
|
C++
继续更新完善:C++ 结构体代码转MASM32代码
继续更新完善:C++ 结构体代码转MASM32代码
|
4月前
|
C++ Windows
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
HTML+JavaScript构建C++类代码一键转换MASM32代码平台