正在载入在线练习界面,本页内容可直接阅读…

AK CSP › CSP-J 2022 第一轮真题 › 第 16 题

CSP-J 2022 第一轮 第 16 题:程序(一,位交织编码):删去 unsigned 是否影响行为

阅读程序 · 程序基本概念与数据类型 · 难度 中等 · 答案 A

题目

01 #include <iostream>
02
03 using namespace std;
04
05 int main()
06 {
07     unsigned short x, y;
08     cin >> x >> y;
09     x = (x | x << 2)& 0x33;
10     x = (x | x << 1)& 0x55;
11     y = (y | y << 2)& 0x33;
12     y = (y | y << 1)& 0x55;
13     unsigned short z = x | y << 1;
14     cout << z << endl;
15     return 0;
16 }

假设输入的 $x,y$ 均是不超过 $15$ 的自然数,完成下面的判断题和单选题:
CSP-J 2022 第一轮 第 16 题 原题
原题扫描(页面加载后可直接在线作答)

本小题

删去第 $7$ 行与第 $13$ 行的 unsigned,程序行为不变。

选项

  • A. 正确
  • B. 错误

答案

A

题解

选 A.正确。

删去 unsigned 后,变量类型由 unsigned short 变为 short。本题中所有数值始终非负,且没有超出 short 的表示范围,所以程序行为不变。

具体来看:

  • 输入的 \(x,y\) 均在 \(0\sim15\) 之间。
  • 经过 & 0x33 后,结果最大为 \(0x33=51\)。
  • 经过 & 0x55 后,结果最大为 \(0x55=85\)。
  • 最后 z = x | (y << 1),结果最大为 \(0xFF=255\)。

中间的左移结果也都在 short 的表示范围内,因此不会因删去 unsigned 而改变计算结果或输出。

关键是:有符号与无符号类型并非总能互换,但本题给定的输入范围保证了可以互换。

真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1 京公网安备11010502062986号