#1649. GESP-C++三级(2026-06)

GESP-C++三级(2026-06)

CCF GESP C++ 三级 (2026 年 06 月)

一、单选题(每题 2 分,共 30 分)

1. 关于计算机的数据编码,下⾯说法正确的是( )

{{ select(1) }}

  • 机器数 1000 1101B 的真值可能是 -13 (如果它是原码)或 141 (如果它是⽆符号数)等数,这取决于我们如何解释它。
  • 计算机中,所有数据最终都以⼆进制、⼋进制、⼗六进制的形式存储和运算。
  • 字节( Byte )是计算机中最⼩的数据单位。位( bit )是计算机中最⼩的存储单位。
  • 计算机中, 1k 字节是 1000 字节的意思。

2. 计算机⼚商为了计算⽅便,⼀般采⽤ 1000 进制。如果我们买的⼚商标注的是 1 TB 的硬盘,它实际的存 储容量是( )。

{{ select(2) }}

  • $1000 \times 1000 \times 1000 \times 1000 \div 1024 \div 1024 \div 1024\,\text{b} = 931\,\text{Gb}$
  • $1000 \times 1000 \times 1000 \times 1000 \div 1024 \div 1024 \div 1024\,\text{B} = 931\,\text{GB}$
  • $1024 \times 1024 \times 1024 \times 1024 \div 1000 \div 1000 \div 1024\,\text{B} = 1049\,\text{GB}$
  • $1000 \times 1024 \times 1024 \times 1024 \div 1024 \div 1024 \div 1024\,\text{B} = 977\,\text{Gb}$

3. 低 4 位、⾼ 4 位压缩技术,适⽤于数据仅使⽤字节的⼀部分(如仅⽤低 4 位)的场景。字节结构:⼀个字节 为 8 位,分为⾼ 4 位(⾼位)和低 4 位(低位)。当数据是⼗六进制数( 0~15,即 0x0 到 0xF ),每个值仅需 4 位表⽰,⾼ 4 位全为 0 。将两个相邻的 4 位值合并为⼀个字节。四个数据 0x1 、 0x2 、 0x3 、 0x4 采⽤上述压 缩技术压缩以后是( )。

{{ select(3) }}

  • 12D 、 34D
  • 12Q 、 34Q
  • 12H 、 34H
  • 00010011B 、 00110101B

4. 关于计算机编码中反码和补码,下⾯说法错误的是( )

{{ select(4) }}

  • 负数的补码,⼀个快速⽅法是从右往左扫描正数的⼆进制形式,遇到第⼀个 1 之后,左边的所有位都取反。
  • 对于一个 n 位的二进制数,其最大表示范围为: $\left[ -\left(2^{n-1} \right)- 1,\; +\left(2^{n-1} - 1\right) \right]$。
  • 反码减法可以统⼀为加法。符号位可以直接参与运算。
  • 反码表⽰中, 0 的表⽰不唯⼀: 0000 0000B 和 1111 1111B 。

5. ⼀种加密⽅式是字符数组与密钥 KEY 、运算⽅式分开传输,⽐如字符数组 char text[4] = {'G', 'E', 'S', 'P'}; 由⼀种传输⽅式发送,密钥 KEY = 2026 通过另⼀种发送⽅式发送,运算⽅式 char function[4] = {'|', '-', '^', '+'}; ⼜是另⼀种发送⽅式发送。三种数据都到达⽬的地以后,分别进⾏例如 'G' | 6、 'E' - 2 、 'S' ^ 0 、 'P' + 2 等计算,来得到相应的真实内容,上述 GESP 通过这种加密⽅式,加密以后 最终的内容是( )。

{{ select(5) }}

  • GCSR
  • RSCG
  • GCSA
  • BCSR

6. 关于位运算,下列说法错误的是( )

{{ select(6) }}

  • 找唯⼀数:数组中唯⼀出现⼀次的数,其余出现两次,全部异或结果即为该数。例如:数组 [5, 7, 9, 7,5](唯⼀数是 9)。
  • 交换两个数: a ^= b; b ^= a; a ^= b; (⽆需临时变量)。
  • 将⼆进制位整体左移 n 位,⾼位溢出舍弃,低位补 0 ;等价于 num×2n \text{num} \times 2^n 。 。
  • 对每⼀个⼆进制位取反,包括符号位,简单运算规则是 ~n = -n - 1 。

7. 关于字符串和字符数组,下列说法正确的是( )

A.

char str[] = "GESP";
int len1 = sizeof(str);
int len2 = strlen(str);

B.

char str1[4] = "GESP";
char str2[4] = {'G', 'E', 'S', 'P'};

C.

char str2[4] = {'G', 'E', 'S', 'P'};
strcpy(str2, "HELLO,GESP");
cout << str2 << endl;

D.

char dest[4] = {'G', 'E', 'S', 'P'};
char src[] = "HELLO";
strcat(dest, src);
cout << dest << endl;

{{ select(7) }}

  • 上⾯A程序能够正确执⾏, len1 与 len2 相等。
  • 上面B这段程序将能够正确执⾏。
  • 上面C这段程序即使能够运⾏,但是存在覆盖数组以外的内存空间的⾏为,可能会引起严重错误。
  • 上面D这段程序能够正确执⾏,不存在数组越界⾏为。

8. 计算机中的 2 KB 等于多少 bit ( )

{{ select(8) }}

  • 16384
  • 20000
  • 2000
  • 2048

9. 在 C++ 中,对于 32 位有符号整数 int 类型数据 n ,关于按位取反运算符 ~ ,下列说法正确的是( )

{{ select(9) }}

  • ~6 的结果是 5 。
  • 按位取反满⾜公式 ~n = -n - 1 。
  • ~0 的结果是 1 。
  • ~(-2) 的结果是 -1 。

10. 关于计算机中的⼆进制编码表⽰,下列说法错误的是( )

{{ select(10) }}

  • 原码是最直观的⼀种有符号数表⽰⽅法。最⾼位(最左边的位)为符号位: 0 表⽰正数, 1 表⽰负数,其余位为数值位(真值的绝对值)。
  • 补码完美解决了原码和反码的缺陷,是现代计算机中表⽰有符号整数的标准⽅式。正数的补码与其原码、反码相同;负数的补码是将其对应正数的原码按位取反(得到反码),然后加 1。
  • 计算补码的⼀个更快的技巧:从右往左扫描正数的⼆进制形式,遇到第⼀个 1 之后,左边的所有位都取反。
  • 对于⼀个 n 位的⼆进制数,补码最大表示范围为 [2n1, +2n1)\left[-2^{n-1},\ +2^{n-1}\right)。 。

11. 下⾯选项中提到的变量都是正整数,关于位运算,下⾯说法错误的是( )

{{ select(11) }}

  • num & 1 ,结果为 1 则奇数, 0 则偶数(仅看最低位)。
  • num & 0xFF 保留低 8 位。
  • num & b 的结果⼀定⼩于等于 num 。
  • 若 num 左移导致⾼位溢出(如超过整型范围),结果符合乘法规律。

12. a=7, b=3, c=14, d=15, e=8 ,对于运算表达式 !a << b & c ^ d | e 的结果是( )

{{ select(12) }}

  • 0
  • 15
  • 7
  • 14

13. 关于 string 的成员函数,下⾯说法错误的是( )

{{ select(13) }}

  • size() :返回字符串长度(字符个数,不含 '\0' )。
  • length() 与 size() 功能完全⼀致,返回字符串长度。
  • empty() :判断字符串是否为空(⾮空返回 true ,空返回 false )。
  • s.append(s2, 0, 3); 从 s2 下标 0 开始,截取 3 个字符。

14. 以下数组定义,符合 C++ 语法的是( )

{{ select(14) }}

  • int [10] a;
  • int b['&'];
  • int c[*];
  • double d[10.0];

15. 现在有⼀个数,请你分别判断它们是否可能是⼆进制、⼋进制、⼗进制、⼗六进制。例如, 6AFF 就只可 能是⼗六进制,⽽ 1011 则是四种进制皆有可能。输⼊ N (保证 1 =< N <= 1000 ),表⽰有 N 个数让你进⾏判断, 接下来输⼊ N 个字符串(保证所有字符串长度不超过 10 ),判断可能是四个进制当中的哪个进制数。输出 N ⾏,每⾏ 4 个数,⽤空格隔开,分别表⽰给定的字符串是否可能表⽰⼀个⼆进制数、⼋进制数、⼗进制数、⼗六进 制数。使⽤ 1 表⽰可能,使⽤ 0 表⽰不可能。下⾯程序横线处可以满⾜这个要求的是( )。

#include <iostream>
using namespace std;
int main() {
  int n = 0;
  cin >> n;
  for (int i = 0; i < n; i++) {
    char str[11];
    cin >> str;
    char max = '0';
    for (int i = 0; str[i] != '\0'; i++)
      if (str[i] > max)
        max = str[i];
    ___________________________________________
  }
  return 0;
}

{{ select(15) }}

  • cout << (max >= '1') << " " << (max >= '7') << " " << (max >= '9') << " " << (max >='F') << endl;
  • cout << (max <= '1') << " " << (max <= '7') << " " << (max <= '9') << " " << (max <='F') << endl;
  • cout << (max = '1') << " " << (max = '7') << " " << (max = '9') << " " << (max = 'F')<< endl;
  • cout << (max < '1') << " " << (max < '7') << " " << (max < '9') << " " << (max < 'F')<< endl;

二、判断题(每题 2 分,共 20 分)

1. 反码运算时,产⽣的进位需要循环进位,即最⾼位产⽣的进位要加回到结果的最低位

{{ select(16) }}

2. -11 的补码的⼀种计算⽅式是从右往左扫描正数的⼆进制形式,遇到第⼀个 1 之后,左边的所有位都取 反。

{{ select(17) }}

3. ⼀个 8 位的⼆进制数补码,最⼤的表⽰范围是从 -127到 +127

{{ select(18) }}

4. 判断某个数是否是质数,枚举范围可适当缩⼩(遍历到i\sqrt{i} ⽽⾮而非 ii ),提升效率

{{ select(19) }}

5. 如果 a 为 int 类型的变量,且表达式 ((a & 1) == 1) 的值为 true ,则说明 a 是奇数

{{ select(20) }}

6. ⼗六进制数 CCF 对应的⼆进制数、⼋进制数、⼗进制数分别是: 110011001111 、 6317 、 3269

{{ select(21) }}

7. 下列程序如果能够正确执⾏,那么输出的结果是 GESP

int main() {
  string name = "GESP";
  cout << name[false] << name[true] << name[1 << 1] << name[7 >> 1] << endl;
}

{{ select(22) }}

8. 某个初学 C++ 的学⽣,在对照参考程序写了⼀个程序以后,信⼼满满地进⾏编译,他敲进编译器的全部代 码如下,这个程序能够正常编译运⾏。

1 #include<bits/stdc++.h>
2 using namespace std;
3 int main() {     
4   cout << "Hello world!" << endl;
5   return 0;
6 }

{{ select(23) }}

9. 代码逐⾏复刻⼿⼯运算步骤,中间不能增加任何判断逻辑,否则就不属于模拟算法

{{ select(24) }}

10. 判断⼀个 int 型数字 s[i] 是不是在 0 和 9 之间(可以是 0 和 9 ),判断条件可以写为 if (s[i] >= '0' && s[i] <= '9') 。

{{ select(25) }}