《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`

相关文章
|
4月前
|
Java 编译器 C++
【Java基础面试一】、为什么Java代码可以实现一次编写、到处运行?
这篇文章解释了Java能够实现“一次编写,到处运行”的原因,主要归功于Java虚拟机(JVM),它能够在不同平台上将Java源代码编译成的字节码转换成对应平台的机器码,实现跨平台运行。
【Java基础面试一】、为什么Java代码可以实现一次编写、到处运行?
|
2月前
|
IDE Java 程序员
C++ 程序员的 Java 指南
一个 C++ 程序员自己总结的 Java 学习中应该注意的点。
26 5
|
3月前
|
算法 程序员 Go
PHP 程序员学会了 Go 语言就能唬住面试官吗?
【9月更文挑战第8天】学会Go语言可提升PHP程序员的面试印象,但不足以 solely “唬住” 面试官。学习新语言能展现学习能力、拓宽技术视野,并增加就业机会。然而,实际项目经验、深入理解语言特性和综合能力更为关键。全面展示这些方面才能真正提升面试成功率。
63 10
|
2月前
|
C语言 C++
实现两个变量值的互换[C语言和C++的区别]
实现两个变量值的互换[C语言和C++的区别]
29 0
|
4月前
|
Java
【Java基础面试七】、请介绍一下实例变量的默认值
这篇文章介绍了Java中实例变量的默认值:引用数据类型的默认值是null,而基本数据类型的默认值根据其类型分别是0、0L、0.0F、0.0、'\u0000'和false。
【Java基础面试七】、请介绍一下实例变量的默认值
|
4月前
|
存储 缓存 Java
面试问Spring循环依赖?今天通过代码调试让你记住
该文章讨论了Spring框架中循环依赖的概念,并通过代码示例帮助读者理解这一概念。
面试问Spring循环依赖?今天通过代码调试让你记住
|
4月前
|
Java 编译器
不同变量的赋值时机 | 常见的面试题 | 静态代码块
这篇文章讨论了Java中不同变量的赋值时机,包括基本数据类型、引用数据类型、类变量、实例变量和局部变量,并解释了静态代码块、代码块和构造函数的执行顺序。
不同变量的赋值时机 | 常见的面试题 | 静态代码块
|
4月前
|
存储 安全 C++
C++:指针引用普通变量适用场景
指针和引用都是C++提供的强大工具,它们在不同的场景下发挥着不可或缺的作用。了解两者的特点及适用场景,可以帮助开发者编写出更加高效、可读性更强的代码。在实际开发中,合理选择使用指针或引用是提高编程技巧的关键。
42 1
【IO面试题 五】、 Serializable接口为什么需要定义serialVersionUID变量?
serialVersionUID用于标识类的序列化版本,确保在反序列化时类的版本一致性,避免因类定义变更导致的不兼容问题。
|
3月前
|
JavaScript 前端开发 Java
通过Gtest访问C++静态、私有、保护变量和方法
通过Gtest访问C++静态、私有、保护变量和方法
103 0