GESP认证C++编程真题解析 | 202606 三级
附上汇总帖:GESP认证C++编程真题解析 | 汇总
单选题
第1题
关于计算机的数据编码,下面说法正确的是( )。
A. 机器数 1000 1101B 的真值可能是 -13 (如果它是原码)或 141 (如果它是无符号数)等数,这取决于我们如何解释它。
B. 计算机中,所有数据最终都以二进制、八进制、十六进制的形式存储和运算。
C. 字节( Byte )是计算机中最小的数据单位。位( bit )是计算机中最小的存储单位。
D. 计算机中, 1k 字节是 1000 字节的意思。
【答案】:A
【解析】
机器数10001101B的解释方式取决于约定:作为原码时,最高位1表示负数,数值位0001101=13,真值为-13;作为无符号数时,所有位均为数值位,真值为141。这说明同一个机器数在不同编码约定下可以表示不同的真值,A正确。B错在计算机中所有数据最终都以二进制形式存储,八进制和十六进制只是书写和阅读的方便表示,并非实际存储形式。C把数据单位和存储单位搞反了,位(bit)是最小的数据单位,字节(Byte)是最小的存储单位。D混淆了两种约定,在计算机科学中1K=1024字节(2^10),而厂商为了计算方便才用1K=1000。
第2题
计算机厂商为了计算方便,一般采用 1000 进制。如果我们买的厂商标注的是 1 TB 的硬盘,它实际的存储容量是( )。
A. \(1000\times 1000 \times 1000 \times 1000 \div 1024 \div 1024 \div 1024b = 931Gb\)
B. \(1000\times 1000 \times 1000 \times 1000 \div 1024 \div 1024 \div 1024B = 931GB\)
C. \(1024\times 1024 \times 1024 \times 1024 \div 1000 \div 1000 \div 1024B = 1049GB\)
D. \(1000\times 1024 \times 1024 \times 1024 \div 1024 \div 1024 \div 1024b = 977Gb\)
【答案】:B
【解析】
厂商采用1000进制,即1T=1000G,1G=1000M,1M=1000K,1K=1000。所以厂商标注的1TB 实际容量为\(1000×1000×1000=10^9\)字节。注意区分:操作系统按1024进制计算,1024是\(2^{10}\),所以,1KB=\(2^{10}\)字节,1MB=\(2^{20}\)字节,1GB=\(2^{30}\)字节,1TB=\(2^{40}\)字节,这就是为什么1TB硬盘在电脑上显示约931GB的原因。
第3题
低 4 位、高 4 位压缩技术,适用于数据仅使用字节的一部分(如仅用低 4 位)的场景。字节结构:一个字节为 8 位,分为高 4 位(高位)和低 4 位(低位)。当数据是十六进制数(\(0\sim 15\),即 0x0 到 0xF ),每个值仅需 4 位表示,高 4 位全为 0 。将两个相邻的 4 位值合并为一个字节。四个数据 0x1 、 0x2 、 0x3 、 0x4 采用上述压缩技术压缩以后是( )。
A. 12D 、 34D
B. 12Q 、 34Q
C. 12H 、 34H
D. 00010011B 、 00110101B
【答案】:C
【解析】
每个十六进制数0x1~0xF只需4位(半字节)表示。压缩时将两个4位数拼成一个8位字节:0x1和0x2合并为一个字节,高4位放0x1,低4位放0x2,即00010010B=0x12;同理0x3和0x4合并为0x34。所以压缩后为12H、34H,用十六进制后缀H表示。选项A用十进制后缀D是错的,0x12的十进制是18而非12;选项B用八进制后缀为O,不是Q;选项D给出的是二进制形式但数值错误,0x1和0x2合并应为00010010B而非00010011B。
第4题
关于计算机编码中反码和补码,下面说法错误的是( )。
A. 负数的补码,一个快速方法是从右往左扫描正数的二进制形式,遇到第一个 1 之后,左边的所有位都取反。
B. 对于一个 \(n\) 位的二进制数:最大表示范围:\([-(2^{n-1}-1,+(2^{n-1}-1)]\) 。
C. 反码减法可以统一为加法。符号位可以直接参与运算。
D. 反码表示中,0 的表示不唯一: 0000 0000B 和 1111 1111B 。
【答案】:B
【解析】
A描述的是求负数补码的快速技巧,从右往左扫描正数二进制,遇到第一个1保持不变,左边各位取反,这是正确的方法。C中反码确实可以将减法统一为加法,符号位参与运算,这是反码的设计初衷之一。D 中反码的+0为00000000B,-0为11111111B,0的表示确实不唯一,这是反码的缺陷之一。B中"8位二进制数最大表示范围-128到127"是补码的范围而非反码的范围,8位反码的表示范围是-127到+127(因为反码有+0和-0两种0的表示,少了一个负数位),所以B张冠李戴,将补码的范围说成了反码的范围,是错误的。
第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
【解析】
密钥 KEY=2026,从个位开始取数字:6、2、0、2,分别对应四个字符的运算。'G' 的 ASCII 码为71,71|6=71(71的二进制01000111与6的二进制00000110按位或,结果仍为01000111=71='G');'E'的
ASCII码为69,69-2=67='C';'S'的 ASCII码为83,83^0=83='S'(任何数异或0保持不变);'P'的ASCII码为80,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
【解析】
A中异或找唯一数是经典应用,相同数异或为0,0异或任何数为本身,所以全部异或后剩下的就是唯一数,正确。B中三步异或交换也是经典技巧,正确。C的描述看似正确,但关键在于"等价于num乘以2”,这个说法忽略了溢出的情况——如果左移后高位溢出,结果并不等于乘以 \(2^n\),所以C的说法不严谨,是错误的。D中按位取反公式n=-n-1是正确的,例如6=-7,~0=-1。
第7题
关于字符串和字符数组,下列说法正确的是( )。
A.
char str[] = "GESP";
int len1 = sizeof(str);
int len2 = strlen(str);
上面程序能够正确执行, len1 与 len2 相等。
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;
这段程序能够正确执行,不存在数组越界行为。
【答案】:C
【解析】
A中sizeof(str)包含末尾'\0',对"GESP"来说sizeof得5,strlen 得4,两者不相等,A错误。B中char str1[4]="GESP"空间不足,字符串字面量"GESP"需要5字节(含'\0'),放入4字节数组会越界,B错误。C中char str2[4]={'G','E','S','P'}只有4字节且无'\0'结尾,strcpy(str2, "HELLO,GESP")要写入11字节,严重越界覆盖数组以外的内存,C正确。D中strcat(dest, src)的dest没有'\0'结尾且只有4字节,拼接"HELLO"后必然越界,D错误。
第8题
计算机中的 2 KB 等于多少 bit ( )。
A. 16384
B. 20000
C. 2000
D. 2048
【答案】:A
【解析】
在计算机科学中,1KB=1024字节=2^10字节,1字节=8位(bit)。所以2KB=2×1024×8=16384bit。选项B和C是按1000进制计算的错误结果,选项 D 只算到了字节数(2×1024=2048字节)而忘了转换为bit。
第9题
在 C++ 中,对于 32 位有符号整数 int 类型数据 n ,关于按位取反运算符 ~ ,下列说法正确的是( )。
A. ~6 的结果是 5 。
B. 按位取反满足公式 ~n = -n - 1 。
C. ~0 的结果是 1 。
D. ~(-2) 的结果是 -1 。
【答案】:B
【解析】
按位取反的公式为n=-n-1,这是核心规律。只有B正确,公式n=-n-1对所有整数成立。
第10题
关于计算机中的二进制编码表示,下列说法错误的是( )。
A. 原码是最直观的一种有符号数表示方法。最高位(最左边的位)为符号位: 0 表示正数, 1 表示负数,其余位为数值位(真值的绝对值)。
B. 补码完美解决了原码和反码的缺陷,是现代计算机中表示有符号整数的标准方式。正数的补码与其原码、反码相同;负数的补码是将其对应正数的原码按位取反(得到反码),然后加 1 。
C. 计算补码的一个更快的技巧:从右往左扫描正数的二进制形式,遇到第一个 1 之后,左边的所有位都取反。
D. 对于一个 n 位的二进制数,补码最大表示范围为 \([-2^{n-1},+2^{n-1}]\)。
【答案】:D
【解析】
A、B、C关于原码和补码的描述都是正确的。D说"对于一个8位的二进制数,补码最大表示范围为-128到127",这一表述本身正确。但原题D选项为n位补码范围的具体数值的公式,应为 \([-2^{n-1}, 2^{n-1}-1]\)。
第11题
下面选项中提到的变量都是正整数,关于位运算,下面说法错误的是( )。
A. num & 1 ,结果为 1 则奇数, 0 则偶数(仅看最低位)。
B. num & 0xFF 保留低 位。
C. num & b 的结果一定小于等于 num 。
D. 若 num 左移导致高位溢出(如超过整型范围),结果符合乘法规律。
【答案】:D
【解析】
A中num&1只看最低位,最低位为1是奇数,为0是偶数,正确。B中0xFF即11111111B,num & 0xFF会将高8位清零,保留低8位,正确。C中按位与运算的结果不会超过两个操作数中的较小者,所以num&b的结果一定不超过num,正确。D中如果左移导致高位溢出,超出部分被丢弃,结果不再符合乘以 \(2^n\) 的规律,所以D是错误的。
第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
【解析】
C++运算符优先级从高到低:逻辑非! > 移位<< > 按位与& > 按位异或^ > 按位或|。逐步计算:!a=!7=0;0<<b=0<<3=0;0&c=0&14=0;0d=015=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
【解析】
A和B中 size() 和 length() 都返回字符串长度,不含'\0',功能完全一致,正确。D中 append(s2, 0, 3)表示从s2的下标0开始截取3个字符追加到s末尾,正确。C的描述说反了,empty()在字符串为空时返回true,非空时返回false,所以C是错误的。
第14题
以下数组定义,符合 C++ 语法的是( )。
A. int [10] a;
B. int b['&'];
C. int c[*];
D. double d[10.0];
【答案】:B
【解析】
A的语法错误,正确写法是int a[10],类型在前、变量名在后。B中'&'是字符常量,其ASCII码值为38,所以int b['&'] 等价于 int b[38],数组大小可以是整型常量表达式,字符常量可以隐式转换为整数,语法合法。C中数组大小不能用通配符*,必须明确指定,错误。D中数组大小必须是整型,不能用浮点数10.0,错误。
第15题
现在有一个数,请你分别判断它们是否可能是二进制、八进制、十进制、十六进制。例如, 6AFF 就只可能是十六进制,而 1011 则是四种进制皆有可能。输入 N (保证 ),表示有 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;
}
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
【解析】
程序先找出字符串中最大的字符max。判断一个字符串是否可能是某种进制,只需看最大字符是否不超过该进制的最大数码。二进制的最大数码是'1',所以max<= '1' 时可能是二进制;八进制的最大数码是'7',max <= '7' 时可能是八进制;十进制的最大数码是'9',max<='9' 时可能是十进制;十六进制的最大数码是'F',max<='F'时可能是十六进制。选项B正好符合这个逻辑。A用>=判断方向反了;C用=是赋值而非比较;D用<太严格,比如"1011"的max是'1','1'<'1'为假,但"1011"明明可以是二进制。
判断题
第1题
反码运算时,产生的进位需要循环进位,即最高位产生的进位要加回到结果的最低位。
A. 正确
B. 错误
【答案】:A
【解析】
反码运算的特点就是循环进位(end-around carry)。当最高位(符号位)产生进位时,这个进位不能像补码那样直接丢弃,而是要加回到结果的最低位。这是因为反码的符号位参与运算后,如果产生进位,相当于多加了一个"全1"的值,需要通过循环进位来修正。这是反码与补码的重要区别之一。
第2题
-11 的补码的一种计算方式是从右往左扫描正数的二进制形式,遇到第一个 1 之后,左边的所有位都取 反。
A. 正确
B. 错误
【答案】:A
【解析】
这是求负数补码的快速技巧。先写出正数11的二进制形式(8位):00001011。从右往左扫描,遇到第一个1(最低位的1)保持不变,其右边的位(无)和该位本身保持不变,左边所有位取反:11110101。这就是-11的补码。此方法与"取反加1"等价,但更快捷。
第3题
一个 8 位的二进制数补码,最大的表示范围是从 -128 到 +128。
A. 正确
B. 错误
【答案】:B
【解析】
8位补码的表示范围是 \(-2^7\) 到 \(2^7-1\),即-128到127,不是-128到128。正数最大只能到127(01111111B),因为最高位是符号位,正数的符号位为0,数值位最大为1111111=127。128的二进制需要9位才能在补码中表示(正数128超出了8位补码的正数范围),所以128不能用8位补码表示。
第4题
判断某个数是否是质数,枚举范围可适当缩小(遍历到 \(\sqrt i\) 而非 \(i\)),提升效率。
A. 正确
B. 错误
【答案】:A
【解析】
判断n是否为质数时,如果n有一个大于1且小于n的因子d,那么d和n/d 中至少有一个不超过 \(\sqrt i\)。因此只需要枚举2到 \(\sqrt i\) 的范围即可判断,时间复杂度从 O(i) 降低到\(O(\sqrt i)\),效率显著提升。
第5题
如果 a 为 int 类型的变量,且表达式 ((a & 1) == 1) 的值为 true ,则说明 a 是奇数。
A. 正确
B. 错误
【答案】:A
【解析】
a & 1 提取 a 的最低位。如果最低位为1,说明a是奇数;如果最低位为0,说明a是偶数。((a & 1) == 1) 为true 意味着最低位是1,所以a是奇数。这是判断奇偶性的经典位运算技巧,比取模运算a%2更高效。
第6题
十六进制数 CCF 对应的二进制数、八进制数、十进制数分别是: 110011001111 、 6317 、 3269 。
A. 正确
B. 错误
【答案】:B
【解析】
十六进制数CCF中,C=12,F=15。转换为二进制:C=1100,F=1111,所以CCF = 110011001111B,这部分正确。转换为八进制:从右往左每3位一组,110011001111B=110|011|001|111=6317Q,这部分也正确。转换为十进制:CCF=12×256+12×16+15=3072+192+15=3279,而非题目所给的3269,所以十进制转换错误。
第7题
下列程序如果能够正确执行,那么输出的结果是 GESP 。
int main() {
string name = "GESP";
cout << name[false] << name[true] << name[1 << 1] << name[7 >> 1] << endl;
}
A. 正确
B. 错误
【答案】:A
【解析】
false 在 C++ 中可隐式转换为0,true 转换为1,1<<1=2,7>>1=3。所以 name[0]='G',name[1]='E',name[2]='S',name[3]='P',输出GESP。
第8题
某个初学 C++ 的学生,在对照参考程序写了一个程序以后,信心满满地进行编译,他敲进编译器的全部代码如下,这个程序能够正常编译运行。
#include<bits/stdc++.h>
using namespace std;
int main() {
cout << "Hello world!" << endl;
return 0;
}
A. 正确
B. 错误
【答案】:A
【解析】
题目描述的关键信息是"对照参考程序写了一个程序"以及"他敲进编译器的全部代码如下"。题目代码每一行前面都标注了行号(1~6),这是试卷排版用于方便定位代码行的编号,并非代码本身的一部分。该学生"对照参考程序"抄写时,把行号1、2、3…也一并当作代码敲进了编译器。而行号直接出现在#include、using、int main()等语句之前,编译器在第一行1 #include<bits/stdc++.h>处就会报错,根本无法通过编译,更谈不上正常运行。所以该说法错误。
第9题
代码逐行复刻手工运算步骤,中间不能增加任何判断逻辑,否则就不属于模拟算法。
A. 正确
B. 错误
【答案】:B
【解析】
模拟算法的核心是按照题目描述的过程一步步实现,但并不意味着"不能增加任何判断逻辑"。实际上,模拟过程中通常需要各种判断(如边界判断、条件分支等)来正确复刻运算过程。模拟算法强调的是按规则逐步推进,中间可以有判断逻辑,只要遵循题目给定的运算规则即可。所以"中间不能增加任何判断逻辑"的说法是错误的。
第10题
判断一个 int 型数字 s[i] 是不是在 0 和 9 之间(可以是 0 和 9 ),判断条件可以写为 if (s[i] >= '0' && s[i] <= '9') 。
A. 正确
B. 错误
【答案】:B
【解析】
题目明确说s[i]是"int 型数字",即存储的是整数数值。而条件s[i]>='0' && s[i]<='9'中'0'、'9'是字符常量,其ASCII码值分别为48和57。如果 s[i]是int型整数,例如5,那么5>=48为false,无法正确判断。正确的写法应为if (s[i]>=0&&s[i]]<=9)。如果s是字符串(char数组),该条件才正确。题目前提是int型,因此该判断条件写法错误。
浙公网安备 33010602011771号