单选题
1、第132题 (1.0分) 题号:128若int类型数据占两个字节,则下列语句的输出为()。int k=-1; printf(”%d,%u\n”,k,k);
A
-1,-1
B
-132767
C
-132768
D
-165535
答案解析
正确答案:D
解析:
这是一道关于C语言中数据类型存储、补码表示以及格式化输出的经典题目。以下是详细解析:
### 1. 题目关键条件分析
* **`int` 类型占两个字节**:这意味着 `int` 是 16 位的。
* 有符号整数 (`signed int`) 的取值范围是:$-2^{15}$ 到 $2^{15}-1$,即 **-32768 到 32767**。
* 无符号整数 (`unsigned int`) 的取值范围是:$0$ 到 $2^{16}-1$,即 **0 到 65535**。
* **`int k = -1;`**:变量 `k` 被赋值为 -1。
* **`printf("%d,%u\n", k, k);`**:
* `%d`:以**有符号十进制整数**形式输出。
* `%u`:以**无符号十进制整数**形式输出。
### 2. 底层二进制存储分析
在计算机中,整数通常以**补码**形式存储。
1. **-1 的原码**(16位):
`1000 0000 0000 0001` (最高位1表示负号)
2. **-1 的反码**:
符号位不变,其余位取反:
`1111 1111 1111 1110`
3. **-1 的补码**:
反码 + 1:
`1111 1111 1111 1111`
所以,内存中 `k` 的二进制位模式全是 1:`1111 1111 1111 1111` (即十六进制的 `0xFFFF`)。
### 3. 格式化输出分析
#### 第一部分:`%d` 输出 `k`
* `%d` 告诉 `printf` 将这块内存解释为**有符号整数**。
* 二进制 `1111 1111 1111 1111` 作为有符号补码,其值就是 **-1**。
* 所以,第一个输出结果是 **-1**。
#### 第二部分:`%u` 输出 `k`
* `%u` 告诉 `printf` 将这块内存解释为**无符号整数**。
* 此时,最高位不再被视为符号位,而是数值位。
* 二进制 `1111 1111 1111 1111` 转换为十进制:
$$2^{15} + 2^{14} + ... + 2^1 + 2^0 = 2^{16} - 1$$
$$2^{16} = 65536$$
$$65536 - 1 = 65535$$
* 所以,第二个输出结果是 **65535**。
### 4. 综合结果
`printf` 的输出格式为 `"%d,%u\n"`,因此最终输出字符串为:
**-1,65535**
### 5. 选项对比
* A. `-1,-1`:错误,`%u` 不会输出负数。
* B. `-132767`:错误,数值不对且格式缺少逗号分隔(假设选项排版问题,数值也不对)。
* C. `-132768`:错误,数值不对。
* D. `-165535`:**正确**。虽然选项排版看起来像连在一起,但结合题意和常见考题格式,它代表的是 `-1` 和 `65535`。
> **注意**:在很多在线题库或老旧教材的排版中,选项中的逗号可能会被省略或显示不明显,或者选项本身意为“第一个数是-1,第二个数是65535”。选项 D 中的 `65535` 是关键匹配项。
### 结论
正确答案是 **D**。
题目纠错
c语言选择判断题库
相关题目
单选题
1、第127题 (1.0分) 题号:639 以下能正确定义数组并正确赋初值的语句是()。
单选题
1、第126题 (1.0分) 题号:689 以下叙述中不正确的是()。
单选题
1、第125题 (1.0分) 题号:603 以下符合C语言语法的赋值表达式是()。
单选题
1、第124题 (1.0分) 题号:141 为了提高程序的运行速度,在函数中对于整型或指针可以使用()型的变量。
单选题
1、第123题 (1.0分) 题号:601 下面四个选项中,均是不合法的浮点数的选项是()。
单选题
1、第122题 (1.0分) 题号:193 具有相同类型的指针变量p与数组a,不能进行的操作是()。
单选题
1、第121题 (1.0分) 题号:673 C语言规定,函数返回值的类型是由()。
单选题
1、第120题 (1.0分) 题号:173 C语言执行程序的开始执行点是()。
单选题
1、第119题 (1.0分) 题号:686 在位运算中,操作数每右移一位,其结果相当于()。
单选题
1、第118题 (1.0分) 题号:200 若有定义:char *p1,*p2,*p3,*p4,ch; 则不能正确赋值的程序语句为()。
