单选题
1、第66题 (1.0分) 题号:146 用下列语句定义a,b,c,然后执行b=a、c='b'+b,则b,c的值是()。 long a=0xffffff; int b; char c;
A
0ffffff 和0x61
B
-1和98
C
-1和97
D
指向同一地址
答案解析
正确答案:C
解析:
这是一道关于 C 语言中数据类型转换、位运算以及 ASCII 码计算的题目。我们需要逐步分析变量的赋值和计算过程。
### 1. 分析变量 `a` 和 `b` 的赋值
**代码语句:**
```c
long a = 0xffffff;
int b;
b = a;
```
* **`a` 的值**:`0xffffff` 是十六进制表示。
* 在常见的 32 位系统中,`long` 通常是 32 位(4字节)。
* `0xffffff` 对应的二进制是 24 个 1。如果视为无符号数,它是 $16,777,215$。
* 但是,关键在于下一步赋值给 `int` 类型的 `b`。
* **`b = a` 的过程(类型转换)**:
* `a` 是 `long` 型,`b` 是 `int` 型。
* 在大多数现代编译器(如 GCC, MSVC)和常见的考试环境中,`int` 和 `long` 往往都是 32 位。
* `0xffffff` 的二进制补码形式取决于它是否被视为负数。
* 如果 `long` 是 32 位,`0xffffff` 实际上等同于 `0x00ffffff`。最高位(符号位)是 0,所以它是一个正数 $16,777,215$。
* **然而**,这道题的正确答案暗示了另一种常见的情况或者是对十六进制字面量符号位的特定理解,或者是题目隐含了 `int` 为 16 位或截断行为?
* 让我们重新审视选项。选项 B 和 C 中 `b` 的值都是 `-1`。
* 如果 `b` 等于 `-1`,那么 `b` 的二进制补码应该是全 1(即 `0xffffffff`)。
* 这说明题目中的 `0xffffff` 可能被视作一个导致高位填充或截断后变为全 1 的值?
* **更可能的解释(针对此类经典考题)**:
很多老旧教材或特定环境下,考察的是 **符号扩展** 或 **截断**。
如果 `int` 是 16 位:`0xffffff` 低 16 位是 `0xffff`,即 `-1`。
如果 `int` 是 32 位:`0xffffff` 是 `16777215`,不是 `-1`。
*注意*:还有一种可能性,题目原本想写的是 `0xffffffff` 或者考察的是有符号数的溢出/截断特性。但在标准的 32 位 `int` 下,`0xffffff` 赋值给 `int` 结果确实是 `16777215`。
**但是**,让我们看选项。只有 B 和 C 给出了具体的整数数值,且 `b` 为 `-1`。这强烈暗示在这个题目的语境下,`b` 的结果被认为是 `-1`。这通常发生在以下两种情况之一:
1. `int` 是 16 位系统(`0xffff` -> -1)。
2. 题目印刷错误,原意可能是 `a = -1` 或 `a = 0xffffffff`。
3. 或者,这里考察的是 `char` 提升时的符号问题,而 `b` 的值其实并不影响最终 `c` 的计算逻辑核心(见下文),但为了匹配选项,我们必须接受 `b = -1` 这个前提。
*修正思考*:让我们再仔细看一遍十六进制 `0xffffff`。
如果这是一个 24 位的值,放入 32 位 `int`,它是正数。
如果题目假设 `int` 为 16 位,则 `b = (int)0xffffff` 会截断低 16 位 `0xffff`,即 `-1`。
鉴于这是经典考试题,往往基于 16 位 `int` 模型或者特定的截断规则,我们暂且认定 **`b = -1`**。
### 2. 分析变量 `c` 的计算
**代码语句:**
```c
char c;
c = 'b' + b;
```
* **字符 `'b'` 的 ASCII 码**:
* `'a'` 是 97 (0x61)。
* `'b'` 是 98 (0x62)。
* **表达式 `'b' + b`**:
* 已知 `b = -1`(根据选项反推及常见考点)。
* 计算:$98 + (-1) = 97$。
* **赋值给 `c`**:
* `c` 是 `char` 类型。
* 结果 `97` 在 `char` 的表示范围内(-128 到 127 或 0 到 255)。
* 所以 `c` 的值就是 **97**。
* 对应的字符是 `'a'`。
### 3. 对比选项
* **A. 0ffffff 和 0x61**:
* `0x61` 是十进制的 97。这部分对上了 `c` 的值。
* 但是 `b` 的值写的是 `0ffffff`,这通常不是标准的输出格式,且如果 `b` 是 `0xffffff` (16777215),那么 `c = 98 + 16777215` 会发生溢出,结果不会是 97。所以 A 不对。
* **B. -1 和 98**:
* `b = -1`。
* `c = 98`?这意味着 `'b' + b` 结果是 98,即 $98 + b = 98 \Rightarrow b = 0$。但这与 `b=-1` 矛盾。所以 B 不对。
* **C. -1 和 97**:
* `b = -1`。
* `c = 97`。
* 计算验证:`'b'` (98) + `b` (-1) = 97。
* 逻辑自洽。
* **D. 指向同一地址**:
* `b` 和 `c` 是基本数据类型变量,存储在栈上不同的内存地址,显然不指向同一地址。
### 结论
尽管在现代 32/64 位系统中 `long a = 0xffffff; int b = a;` 的结果 `b` 应为 `16777215`,但在这类经典计算机二级或基础 C 语言考试题中,往往隐含了 **16 位 int** 的环境,或者考察的是 **截断** 概念(取低字节/低字),使得 `b` 变为 `-1` (`0xffff`)。
在此前提下:
1. `b` 的值为 **-1**。
2. `c = 'b' + b = 98 + (-1) = 97`。
因此,`b` 为 -1,`c` 为 97。
正确答案是 **C**。
题目纠错
c语言选择判断题库
相关题目
单选题
1、第193题 (1.0分) 题号:120 假设所有变量均为整型,表达式:a=2,b=5,a>b?a++:b++,a+b的值 是()。
单选题
1、第192题 (1.0分) 题号:138 以下程序的输出结果是()。
单选题
1、第191题 (1.0分) 题号:641 若有说明:int a[10];则对a数组元素的正确引用是()。
单选题
1、第190题 (1.0分) 题号:696 设 int b=2;表达式(b>>2)/(b>>1)的值是()。
单选题
1、第189题 (1.0分) 题号:724 若调用fputc函数输出字符成功,则其返回值是()。
单选题
1、第188题 (1.0分) 题号:159 下列程序的输出为()。
单选题
1、第187题 (1.0分) 题号:722 利用 fseek 函数可以实现的操作是()。
单选题
1、第186题 (1.0分) 题号:576 设以下变量均为int类型,则值不等于7的表达式是()。
单选题
1、第185题 (1.0分) 题号:142 以下程序的输出结果为()。
单选题
1、第184题 (1.0分) 题号:559 一个算法应该具有”确定性”等5个特性,下面对另外4个特性的描述 中错误的是()。
