


第一部分 选择题 第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 | 字符数组 | strcpy、strcat 使用时必须保证目标数组空间足够,避免数组越界 |
这7题虽然都是选择题,但实际上对应的是三级考试中容易反复考查的基础概念。只有真正理解了这些故事背后的原理,后面的判断题和编程题也会轻松很多。





