2026年6月GESP真题及题解(C++三级): 选择题和判断题(题解)

2026年6月GESP真题及题解(C++三级): 选择题和判断题(题解)

选择题

第1题

题目: 关于计算机的数据编码,下面说法正确的是( )。

A. 机器数 10001101B 的真值可能是 -13(如果它是原码)或 141(如果它是无符号数)等数,这取决于我们如何解释它。

B. 计算机中,所有数据最终都以二进制、八进制、十六进制的形式存储和运算。

C. 字节(Byte)是计算机中最小的数据单位。位(bit)是计算机中最小的存储单位。

D. 计算机中,1k 字节是 1000 字节的意思。

答案: A

解析:

10001101B 作为无符号数是 (128+8+4+1=141);作为原码,最高位为符号位,1 表示负数,数值位 0001101 为 13,所以真值为 (-13)。

B 错:计算机最终以二进制存储和运算,八进制、十六进制只是书写形式。

C 错:位(bit)是最小数据单位,字节(Byte)是常用存储单位。

D 错:1KB 通常为 1024 字节。


第2题

题目: 计算机厂商为了计算方便,一般采用 1000 进制。如果我们买的厂商标注的是 1TB 的硬盘,它实际的存储容量是( )。

A. 1000 × 1000 × 1000 × 1000 ÷ 1024 ÷ 1024 ÷ 1024 ≈ 931 G B 1000\times1000\times1000\times1000\div1024\div1024\div1024\approx931\mathrm{GB} 1000×1000×1000×1000÷1024÷1024÷1024≈931GB

B. 1000 × 1000 × 1000 × 1000 ÷ 1024 ÷ 1024 ÷ 1024 ≈ 931 G B 1000\times1000\times1000\times1000\div1024\div1024\div1024\approx931\mathrm{GB} 1000×1000×1000×1000÷1024÷1024÷1024≈931GB

C. 1024 × 1024 × 1024 × 1024 ÷ 1000 ÷ 1000 ÷ 1024 B = 1049 G B 1024\times1024\times1024\times1024\div1000\div1000\div1024\mathrm{B}=1049\mathrm{GB} 1024×1024×1024×1024÷1000÷1000÷1024B=1049GB

D. 1000 × 1024 × 1024 × 1024 ÷ 1024 ÷ 1024 ÷ 1024 ≈ 977 G B 1000\times1024\times1024\times1024\div1024\div1024\div1024\approx977\mathrm{GB} 1000×1024×1024×1024÷1024÷1024÷1024≈977GB

答案: B

解析:

厂商标注的 1TB 按 1000 进制计算:

1 T B = 1000 4 B 1TB=1000^4\mathrm{B} 1TB=10004B

操作系统按 1024 进制换算:

1000 4 1024 3 ≈ 931 G B \frac{1000^4}{1024^3}\approx931\mathrm{GB} 1024310004≈931GB

所以选 B。


第3题

题目: 低 4 位、高 4 位压缩技术,适用于数据仅使用字节的一部分(如仅用低 4 位)的场景。字节结构:一个字节为 8 位,分为高 4 位和低 4 位。当数据是十六进制数((0\sim15),即 0x0 到 0xF),每个值仅需 4 位表示,高 4 位全为 0。将两个相邻的 4 位值合并为一个字节。四个数据 0x1、0x2、0x3、0x4 采用上述压缩技术压缩以后是( )。

A. 120、340

B. 12Q、34Q

C. 12H、34H

D. 00010011B、00110101B

答案: C

解析:

将相邻两个 4 位值合并:

  • 0x1 和 0x2 合并为 0x12,即 12H
  • 0x3 和 0x4 合并为 0x34,即 34H

所以选 C。


第4题

题目: 关于计算机编码中反码和补码,下面说法错误的是( )。

A. 负数的补码,一个快速方法是从右往左扫描正数的二进制形式,遇到第一个 1 之后,左边的所有位都取反。

B. 对于一个 (n) 位的二进制数:最大表示范围: − ( 2 n − 1 ) − 1 , + ( 2 n − 1 − 1 ) \left-(2\^{n-1})-1,\\ +(2\^{n-1}-1)\\right −(2n−1)−1, +(2n−1−1)。

C. 反码减法可以统一为加法。符号位可以直接参与运算。

D. 反码表示中,0 的表示不唯一:0000 0000B 和 1111 1111B。

答案: B

解析:

(n) 位补码的表示范围是:

− 2 n − 1 , 2 n − 1 − 1 \] \[-2\^{n-1},\\ 2\^{n-1}-1\] \[−2n−1, 2n−1−1

B 中写成 − ( 2 n − 1 ) − 1 , + ( 2 n − 1 − 1 ) \left-(2\^{n-1})-1,\\ +(2\^{n-1}-1)\\right −(2n−1)−1, +(2n−1−1),范围错误。

A、C、D 均正确。


第5题

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

A. GCSR

B. RSCG

C. GCSA

D. BCSR

答案: A

解析:

逐项计算:

  • 'G' | 6:'G' 的 ASCII 为 71,71 | 6 = 71,仍为 'G'
  • 'E' - 2:69 - 2 = 67,为 'C'
  • 'S' ^ 0:83 ^ 0 = 83,仍为 'S'
  • 'P' + 2:80 + 2 = 82,为 'R'

结果为 GCSR,选 A。


第6题

题目: 关于位运算,下列说法错误的是( )。

A. 找唯一数:数组中唯一出现一次的数,其余出现两次,全部异或结果即为该数。例如:数组 [5,7,9,7,5],唯一数是 9。

B. 交换两个数:a^=b; b^=a; a^=b;,无需临时变量。

C. 将二进制位整体左移 n 位,高位溢出舍弃,低位补 0;等价于 num 乘以 (2^n)。

D. 对每一个二进制位取反,包括符号位,简单运算规则是 ~n = -n - 1。

答案: C

解析:

左移 n 位只有在不溢出且操作数为非负无符号数时,才等价于乘以 (2^n)。如果发生高位溢出,或者有符号负数左移,结果不一定符合乘法规律。

A、B、D 均正确。


第7题

题目: 关于字符串和字符数组,下列说法正确的是( )。

A.

cpp 复制代码
char str[] = "GESP";
int len1 = sizeof(str);
int len2 = strlen(str);

上面程序能够正确执行,len1 与 len2 相等。

B.

cpp 复制代码
char str1[4] = "GESP";
char str2[4] = {'G','E','S','P'};

这段程序将能够正确执行。

C.

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

这段程序即使能够运行,但是存在覆盖数组以外的内存空间的行为,可能会引起严重错误。

D.

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

这段程序能够正确执行,不存在数组越界行为。

答案: C

解析:

A 错:sizeof(str) 包含结尾 '\0',为 5;strlen(str) 为 4。

B 错:char str1[4] = "GESP"; 需要 5 个字节,数组长度不足。

C 对:str2 只有 4 字节,复制长字符串会越界。

D 错:dest 没有以 '\0' 结尾,strcat 会越界。


第8题

题目: 计算机中的 2KB 等于多少 bit( )。

A. 16384

B. 20000

C. 2000

D. 2048

答案: A

解析:

2 K B = 2 × 1024 B = 2048 B 2KB=2\times1024B=2048B 2KB=2×1024B=2048B

2048 × 8 = 16384 bit 2048\times8=16384\text{ bit} 2048×8=16384 bit

所以选 A。


第9题

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

A. ~6 的结果是 5。

B. 按位取反满足公式 ~n = -n - 1。

C. ~0 的结果是 1。

D. ~(-2) 的结果是 -1。

答案: B

解析:

按位取反满足:

∼ n = − n − 1 \sim n = -n - 1 ∼n=−n−1

验证:

  • ~6 = -7,A 错
  • ~0 = -1,C 错
  • ~(-2) = 1,D 错

所以选 B。


第10题

题目: 关于计算机中的二进制编码表示,下列说法错误的是( )。

A. 原码是最直观的一种有符号数表示方法。最高位为符号位:0 表示正数,1 表示负数,其余位为数值位。

B. 补码完美解决了原码和反码的缺陷,是现代计算机中表示有符号整数的标准方式。正数的补码与其原码、反码相同;负数的补码是将其对应正数的原码按位取反得到反码,然后加 1。

C. 计算补码的一个更快的技巧:从右往左扫描正数的二进制形式,遇到第一个 1 之后,左边的所有位都取反。

D. 对于一个 (n) 位的二进制数,补码最大表示范围为 − 2 n − 1 , + 2 n − 1 -2\^{n-1}, +2\^{n-1} −2n−1,+2n−1。

答案: D

解析:

(n) 位补码的表示范围是:

− 2 n − 1 , 2 n − 1 − 1 \] \[-2\^{n-1},\\ 2\^{n-1}-1\] \[−2n−1, 2n−1−1

D 中右端写成 + 2 n − 1 +2^{n-1} +2n−1,错误。

A、B、C 均正确。


第11题

题目: 下面选项中提到的变量都是正整数,关于位运算,下面说法错误的是( )。

A. num & 1,结果为 1 则奇数,0 则偶数。

B. num & 0xFF 保留低 8 位。

C. num & b 的结果一定小于等于 num。

D. 若 num 左移导致高位溢出(如超过整型范围),结果符合乘法规律。

答案: D

解析:

左移如果发生高位溢出,超出类型范围的部分会被截断,结果不一定符合乘法规律。

A、B、C 均正确。


第12题

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

A. 0

B. 15

C. 7

D. 14

答案: B

解析:

运算符优先级:! > << > & > ^ > |。

计算:

  • !a = !7 = 0
  • 0 << 3 = 0
  • 0 & c = 0 & 14 = 0
  • 0 ^ d = 0 ^ 15 = 15
  • 15 | e = 15 | 8 = 15

结果为 15,选 B。


第13题

题目: 关于 string 的成员函数,下面说法错误的是( )。

A. size():返回字符串长度,字符个数,不含 '\0'。

B. length() 与 size() 功能完全一致,返回字符串长度。

C. empty():判断字符串是否为空,非空返回 true,空返回 false。

D. s.append(s2,0,3); 从 s2 下标 0 开始,截取 3 个字符。

答案: C

解析:

empty() 的规则是:空字符串返回 true,非空字符串返回 false。

C 中说法反了,所以错误。


第14题

题目: 以下数组定义,符合 C++ 语法的是( )。

A. int[10]a;

B. int b['&'];

C. int c[x];

D. double d[10.0];

答案: B

解析:

A 错:数组定义应为 int a[10];。

B 对:'&' 是字符常量,本质是整型常量,可以作为数组长度。

C 错:x 是变量,不是常量表达式。

D 错:数组长度必须是整数,10.0 是浮点数。


第15题

题目: 现在有一个数,请你分别判断它们是否可能是二进制、八进制、十进制、十六进制。例如,6AFF 就只可能是十六进制,而 1011 则是四种进制皆有可能。输入 (N)(保证 1 ≤ N ≤ 1000 1\leq N\leq 1000 1≤N≤1000),表示有 (N) 个数让你进行判断,接下来输入 (N) 个字符串,判断可能是四个进制当中的哪个进制数。输出 (N) 行,每行 4 个数,用空格隔开,分别表示给定的字符串是否可能表示一个二进制数、八进制数、十进制数、十六进制数。使用 1 表示可能,使用 0 表示不可能。下面程序横线处可以满足这个要求的是( )。

cpp 复制代码
#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;
}

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

B. cout << (max <= '1') << " " << (max <= '7') << " " << (max <= '9') << " " << (max <= 'F') << endl;

C. cout << (max = '1') << " " << (max = '7') << " " << (max = '9') << " " << (max = 'F') << endl;

D. cout << (max < '1') << " " << (max < '7') << " " << (max < '9') << " " << (max < 'F') << endl;

答案: B

解析:

根据字符串中最大字符判断:

  • 二进制只允许 0~1,所以 max <= '1'
  • 八进制只允许 0~7,所以 max <= '7'
  • 十进制只允许 0~9,所以 max <= '9'
  • 十六进制允许 0~9, A~F,所以 max <= 'F'

因此选 B。


判断题

第1题

题目: 反码运算时,产生的进位需要循环进位,即最高位产生的进位要加回到结果的最低位。

答案: √

解析:

反码加减法中,符号位参与运算。如果最高位产生进位,需要将这个进位加回到最低位,称为循环进位。


第2题

题目: -11 的补码的一种计算方式是从右往左扫描正数的二进制形式,遇到第一个 1 之后,左边的所有位都取反。

答案: √

解析:

这是补码快速计算法。11 的二进制为 00001011,从右往左遇到第一个 1 后,左边所有位取反,得到 11110101,即 -11 的补码。


第3题

题目: 一个 8 位的二进制数补码,最大的表示范围是从 -127 到 +127。

答案: ×

解析:

8 位补码的表示范围是:

− 128 ∼ + 127 -128 \sim +127 −128∼+127

题目漏掉了 -128,所以错误。


第4题

题目: 判断某个数是否是质数,枚举范围可适当缩小(遍历到 i \sqrt{i} i 而非 i),提升效率。

答案: √

解析:

若一个数 (i) 有因子,则必有一个因子不大于 i \sqrt{i} i 。因此只需枚举到 i \sqrt{i} i 即可判断质数。


第5题

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

答案: √

解析:

a & 1 取 a 的最低位。最低位为 1 表示奇数,最低位为 0 表示偶数。因此该判断正确。


第6题

题目: 十六进制数 CCF 对应的二进制数、八进制数、十进制数分别是:110011001111、6317、3269。

答案: ×

解析:

CCF 的十进制值为:

12 × 256 + 12 × 16 + 15 = 3072 + 192 + 15 = 3279 12\times256+12\times16+15=3072+192+15=3279 12×256+12×16+15=3072+192+15=3279

不是 3269。

二进制 110011001111 和八进制 6317 是正确的。


第7题

题目: 下列程序如果能够正确执行,那么输出的结果是 GESP。

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

答案: √

解析:

false 为 0,true 为 1,1 << 1 为 2,7 >> 1 为 3。

依次访问:

  • name[0] = 'G'
  • name[1] = 'E'
  • name[2] = 'S'
  • name[3] = 'P'

输出 GESP,正确。


第8题

题目: 某个初学 C++ 的学生,在对照参考程序写了一个程序以后,信心满满地进行编译,他敲进编译器的全部代码如下,这个程序能够正常编译运行。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main() {
    cout << "Hello world!" << endl;
    return 0;
}

答案: √

解析:

该程序包含头文件、命名空间、main 函数和输出语句,语法正确,可以正常编译运行。


第9题

题目: 代码逐行复刻手工运算步骤,中间不能增加任何判断逻辑,否则就不属于模拟算法。

答案: ×

解析:

模拟算法可以用代码模拟题目描述的过程,中间可以包含判断、循环、分支等逻辑。说"不能增加任何判断逻辑"是错误的。


第10题

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

答案: ×

解析:

如果 s[i] 是 int 型数字,值本身在 0 到 9 之间,应写为:

cpp 复制代码
if (s[i] >= 0 && s[i] <= 9)

'0' 和 '9' 是字符常量,对应 ASCII 值 48 和 57,不适合直接判断 int 型数字 0 到 9。


各种学习资料,助力大家一站式学习和提升!!!

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"##########  一站式掌握信奥赛知识!  ##########";
	cout<<"#############  冲刺信奥赛拿奖!  #############";
	cout<<"######  课程购买后永久学习,不受限制!   ######";
	return 0;
}

【秘籍汇总】(完整csp信奥赛C++学习资料):

1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):

https://edu.csdn.net/lecturer/7901 点击跳转

2、CSP信奥赛C++竞赛拿奖视频课:

https://edu.csdn.net/course/detail/40437 点击跳转

https://edu.csdn.net/course/detail/41081 点击跳转

3、csp信奥赛高频考点知识详解及案例实践:

CSP信奥赛C++动态规划:

https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转

CSP信奥赛C++标准模板库STL:

https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转

信奥赛C++提高组csp-s知识详解及案例实践:

https://blog.csdn.net/weixin_66461496/category_13113932.html 点击跳转

4、csp信奥赛冲刺一等奖有效刷题题解:

信奥赛C++普及组CSP-J一等奖通关刷题题单及题解:

https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转

信奥赛C++普及组csp-j初赛&复赛真题题解(持续更新): https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新):

https://blog.csdn.net/weixin_66461496/category_13125089.html 点击跳转

5、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转

GESP(C++ 七级+八级)真题题解(持续更新):

https://blog.csdn.net/weixin_66461496/category_13117178.html 点击跳转

· 文末祝福 ·

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"跟着王老师一起学习信奥赛C++";
	cout<<"    成就更好的自己!       ";
	cout<<"  csp信奥赛一等奖属于你!   ";
	return 0;
}
相关推荐
C++ 老炮儿的技术栈1 小时前
static的作用
c语言·c++·人工智能·单片机·c
程序员老陆2 小时前
C++ 未定义行为全景:对象模型、优化边界与工程防御
开发语言·c++·程序设计
小小龙学IT3 小时前
Go 语言 cgo 与 C/C++ 互操作深度解析:从 fwlib 直连到工业数采网关实战系列
c语言·c++·golang
程序员老陆5 小时前
C++ 多线程通信方式全景:从共享内存到结构化协调
开发语言·c++
某不知名網友5 小时前
ROS2 核心通信:话题发布与订阅详解
开发语言·c++
C++ 老炮儿的技术栈5 小时前
char (*csConnectName)[256]; 和 char csConnectName [256] 有什么区别
java·c语言·开发语言·c++·人工智能·算法·c
大鹏说大话5 小时前
C++ STL 容器怎么选?vector、list、map、unordered_map 对比
开发语言·c++·list
JMchen5 小时前
性能优化——让Native代码飞起来
android·c++·性能优化
chenbingjie_c6 小时前
手撕 C++ priority_queue:二叉堆 + 模板仿函数 + 模板特化(保姆级逐函数拆解)
开发语言·c++