GESP2026年6月认证C++三级( 第一部分选择题(1-7))精讲




第一部分 选择题 第1题

《神秘数字王国------同一个二进制,为什么能表示不同的数字?》

题目:

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

答案:A


1、🌈故事开始

一天,小杨来到了数字王国。

(1)国王递给他一张纸:

复制代码
10001101

(2)国王问:

"小杨,这是多少?"


(3)小杨立刻回答:

"141!"


(4)旁边的大臣却说:

"不对,是-13!"


(5)小杨惊呆了:

"怎么同一个数字还能有两个答案?"


(6)国王笑了:

"因为它戴了不同的帽子!"


2、第一种帽子------无符号数

如果它表示普通数字:

复制代码
10001101₂

计算:

复制代码
128+8+4+1
=141

所以

复制代码
141

3、第二种帽子------原码

如果最高位表示符号:

复制代码
1

表示负数。

后面

复制代码
0001101

就是13。

所以表示

复制代码
-13

4、于是:

复制代码
10001101

可以表示141
也可以表示-13

这完全取决于:

我们怎么看它。


5、🎯知识点

**二进制数字的值,**真正决定意义的是:

  • 无符号数

  • 原码

  • 反码

  • 补码

不同解释:

得到不同数字。


6、为什么B、C、D选项错?

(1)B说:

复制代码
计算机最终以二进制、八进制、十六进制存储。

这是错误的。

真正存储只有:

复制代码
二进制!

八进制、十六进制只是方便人看。


(2)为什么C错?

C说:

复制代码
Byte是最小单位

实际上:

最小单位是

复制代码
bit(位)

8 bit

才等于

复制代码
1 Byte

1字节


(3)为什么D错?

D说:

复制代码
1KB=1000Byte

计算机里:

复制代码
1KB=1024Byte

7、⭐考试技巧

遇见:

数据存储

牢记:

复制代码
计算机真正存储:

只有二进制!


第一部分 第2题

《硬盘商人的秘密------为什么1TB买回来变小了?》

答案:

B


1、🌈故事

(1)小杨买了一个

复制代码
1TB

硬盘。

回家插电脑。

电脑却显示:

复制代码
931GB

(2)他气坏了:

"老板骗我!"

老板笑着说:

"没有骗你,只是我们算的方法不一样。"


2、两种计算方式

(1)厂家:

复制代码
1000进制

所以:

复制代码
1KB=1000B

1MB=1000KB

1GB=1000MB

1TB=1000GB

(2)电脑:

复制代码
1024进制

所以:

复制代码
1KB=1024B

因此:

复制代码
1000000000000

÷1024

÷1024

÷1024

÷1024

≈931GB

所以电脑看到:

复制代码
931GB左右

3、🎯知识点

考试牢记:

厂家:

复制代码
1000

电脑:

复制代码
1024


第一部分 第3题

《压缩小精灵------两个数字住进一间房》

答案:

C


1、🌈故事

(1)有四个数字:

复制代码
1

2

3

4

(2)每个数字只有

复制代码
4bit

(3)于是压缩精灵说:

"两个人住一间!"


2、第一个字节:

复制代码
0001
0010

合起来:

复制代码
00010010

写成十六进制:

复制代码
12H

3、第二个字节:

复制代码
0011
0100

合起来:

cpp 复制代码
00110100

就是:

复制代码
34H

4、所以为:

复制代码
12H

34H

答案:

复制代码
C

5、🎯知识点

一个字节:

复制代码
8bit

一个十六进制:

复制代码
4bit

因此:

复制代码
一个字节

刚好两个十六进制数字。

6、🎯易错点

(1)12H、34H 并不是 C++ 的语法,而是一种计算机教材、电子电路、汇编语言中经常使用的十六进制表示方法。

在 C++ 中,我们不能写成 12H,而应该写成:

复制代码
0x12
0x34

(2)以前很多教材、CPU手册、汇编语言都是这样写。

例如:

复制代码
FFH

表示:

复制代码
0xFF

很多电子工程师今天仍然这么写。



第一部分 第4题

《补码魔法学院------谁说错了?》

答案:

B


这题主要考:

补码范围。


1、🌈故事

(1)补码王国里住着8位士兵。

他们只能表示:

复制代码
256个数字

范围:

复制代码
-128

~

127

(2)一定牢记:

复制代码
最大

127

最小

-128

2、A为什么对?

快速求补码:

复制代码
从右向左

找到第一个1

左边全部取反

这是经典技巧。


3、C为什么对?

反码:

复制代码
减法

可以变加法

4、D为什么对?

反码:

复制代码
+0

00000000

还有

复制代码
-0

11111111

所以:

cpp 复制代码
反码表示中,0有两种表示方式。

5、🎯知识点

补码:

复制代码
唯一一个0

反码:

cpp 复制代码
有两个0


第一部分 第5题

《三把神秘钥匙------字符加密》

答案:

A


1、🌈故事

(1)国王把秘密拆成三份:

第一份:

复制代码
GESP

第二份:

复制代码
2026

第三份:

复制代码
| - ^ +

只有三份合起来才能解密。


(2)分别计算:


复制代码
'G' | 6

ASCII:

复制代码
G=71
cpp 复制代码
71|6 =71

仍然:

复制代码
G

cpp 复制代码
'E'

69 -2 =67

=C

cpp 复制代码
'S'

83^0 =83

=S

任何数:

复制代码
^0

都不变

cpp 复制代码
'P'

80 +2 = 82

 R

(3)得到:

复制代码
GCSR

答案:

复制代码
A

2、🎯知识点

小窍门:

cpp 复制代码
x ^ 0 = x

x | 0 = x

字符本质就是:

复制代码
ASCII整数


第一部分 第6题

《位运算四兄弟》

答案:

C(错误)


1、🌈故事

位运算学院有四位同学。


第一位:异或

复制代码
5

7

9

7

5

两两抵消:

复制代码
5^5=0

7^7=0

最后:

复制代码
9

第二位:交换

复制代码
a^=b

b^=a

a^=b

不用第三个变量。


第三位:左移

(1)他说:

复制代码
左移

一定乘2

(2)汉克老师说:

"不对!"

只有:

没有溢出

才成立。


(3)如果:

复制代码
11111111

左移:

高位丢了。

结果完全变了。


(4)因此:

复制代码
左移≈乘2

不是永远成立。

第四位:取反公式

复制代码
~n=-n-1

这是经典公式。


2、🎯考试技巧

左移:

复制代码
没有溢出

≈乘2

千万不要说:

复制代码
永远乘2!


第一部分 第7题

《危险的字符仓库------数组越界》

答案:

C


1、🏠第一个选项(A)

(1)程序:

复制代码
char str[] = "GESP";

int len1 = sizeof(str);
int len2 = strlen(str);

A说:

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

到底对不对?


(2)我们先看看数组里面到底装了什么?

有的同学认为:

cpp 复制代码
G
E
S
P

其实不是。

字符串最后还有一个结束符

复制代码
'\0'

(3)真正存储的是:

下标 0 1 2 3 4
内容 G E S P '\0'

所以数组大小其实是:

复制代码
5

(4)sizeof()

sizeof 是什么?

可以把它理解成:

sizeof 是计算一个对象占用了多少个字节(Byte)的空间。

整个数组有几个格子?

复制代码
G
E
S
P
\0

一共:

复制代码
5

所以

复制代码
sizeof(str)

得到:

复制代码
5

(5)strlen()

strlen 是什么?

可以理解成:

数真正的字符。

它遇到

复制代码
'\0'

就停止。

因此:

复制代码
G
E
S
P

只有:

复制代码
4

所以:

复制代码
strlen(str)

得到:

复制代码
4

因此:

复制代码
len1=5

len2=4

当然:

不相等!

所以:

❌ A错误。


🏠第二个选项(B)

(1)看程序:

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

(2)B说:

这段程序能够正确执行。

很多孩子第一眼觉得:

"不是都放进去了吗?"

其实不是!


(3)第一行为什么错?

看看:

复制代码
"GESP"

真正需要几个字符?

复制代码
G
E
S
P
\0

一共:

复制代码
5

(4)但是:

复制代码
char str1[4]

只有:

复制代码
4

个位置。

根本放不下。


(5)因此:

复制代码
编译错误

或者:

复制代码
初始化失败

(6)第二行呢?

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

这里只有:

复制代码
4

个字符。

没有:

复制代码
'\0'

所以:

它不是一个C风格字符串。

只是:

复制代码
字符数组

它本身没有问题。


(7)为什么整个B还是错?

因为:

第一句错了。

整个程序当然不能正确执行。

所以:

❌ B错误。


🏠第三个选项(C)

(1)看程序:

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

strcpy(str2,"HELLO,GESP");

cout<<str2<<endl;

(2)题目说:

即使能够运行,也存在覆盖数组以外内存空间的行为。

这是正确答案。


(3)为什么?

数组:

复制代码
4格

却要复制:

复制代码
HELLO,GESP

长度:

复制代码
10+1

(还有结束符)


(4)显然:

复制代码
11

个字符。

于是:

复制代码
4格房子

硬塞11个人

后面的人:

全部跑到别人家去了。


(5)这叫:

数组越界(Buffer Overflow)

这是 C++ 危险的问题之一。

✅ C选项正确。


🏠第四个选项(D)

(1)看程序:

复制代码
char dest[4]={'G','E','S','P'};

char src[]="HELLO";

strcat(dest,src);

cout<<dest<<endl;

(2)D说:

不存在数组越界。

真的吗?

当然不是!


(3)strcat 是什么?

strcat 的意思就是:
把后面的字符串接到前面字符串后面。


(4)例如:

复制代码
ABC

+

DEF

变成:

复制代码
ABCDEF

(5)但是:

dest:

只有:

复制代码
4格

(6)里面已经放满了:

复制代码
G
E
S
P

更重要的是:

它连

复制代码
'\0'

都没有!


(7)然后:

再拼接:

复制代码
HELLO

需要更多空间。

所以:

复制代码
继续越界。

(8)因此:

❌ D错误。


🎯这里还有一个更大的坑!

很多同学认为:

复制代码
char dest[4]={'G','E','S','P'};

就是字符串。

其实不是!

它只是:

复制代码
字符数组

因为没有:

复制代码
'\0'

所以:

复制代码
strcat()

连字符串结束在哪里都不知道。

它会一直往后找:

cpp 复制代码
直到碰巧找到一个'\0'

结果完全不可预测。


这就是:

未定义行为(Undefined Behavior)

比普通越界还危险!


选项 是否正确 为什么?
A sizeof() 包括 '\0',结果是5;strlen() 不包括 '\0',结果是4,因此两者不相等。
B "GESP" 实际需要5个字符(包括结束符),char str1[4] 空间不足,初始化就错误。
C strcpy() 复制的字符串远大于目标数组容量,会覆盖数组外内存,发生数组越界。
D dest 既没有 '\0',空间又不足,strcat() 会产生未定义行为,并发生数组越界。

复制代码

🎓 知识总结

这 7 道题几乎覆盖了 GESP 三级最重要的基础知识:

题号 核心知识 必须牢记
1 数据编码 同一个二进制,不同编码表示不同数字;计算机只存二进制
2 存储单位 厂家按1000进制,计算机按1024进制
3 数据压缩 1个十六进制数占4 bit,2个十六进制数正好组成1 Byte
4 补码 8位补码范围:-128~127;补码只有一个0
5 ASCII与位运算 字符本质是整数,掌握 ^0=x、`
6 位运算 异或找唯一数、异或交换、~n=-n-1、左移乘2需不溢出
7 字符数组 strcpystrcat 使用时必须保证目标数组空间足够,避免数组越界

这7题虽然都是选择题,但实际上对应的是三级考试中容易反复考查的基础概念。只有真正理解了这些故事背后的原理,后面的判断题和编程题也会轻松很多。