第一部分 选择题 第1题
《神秘数字王国——同一个二进制,为什么能表示不同的数字?》
题目:
关于计算机的数据编码,下面说法正确的是( )。
答案:A。
1、🌈故事开始
一天,小杨来到了数字王国。
(1)国王递给他一张纸:
10001101(2)国王问:
"小杨,这是多少?"
(3)小杨立刻回答:
"141!"
(4)旁边的大臣却说:
"不对,是-13!"
(5)小杨惊呆了:
"怎么同一个数字还能有两个答案?"
(6)国王笑了:
"因为它戴了不同的帽子!"
2、第一种帽子——无符号数
如果它表示普通数字:
10001101₂计算:
128+8+4+1 =141所以
1413、第二种帽子——原码
如果最高位表示符号:
1表示负数。
后面
0001101就是13。
所以表示
-134、于是:
10001101 可以表示141 也可以表示-13这完全取决于:
我们怎么看它。
5、🎯知识点
二进制数字的值,真正决定意义的是:
无符号数
原码
反码
补码
不同解释:
得到不同数字。
6、为什么B、C、D选项错?
(1)B说:
计算机最终以二进制、八进制、十六进制存储。这是错误的。
真正存储只有:
二进制!八进制、十六进制只是方便人看。
(2)为什么C错?
C说:
Byte是最小单位实际上:
最小单位是
bit(位)8 bit
才等于
1 Byte1字节
(3)为什么D错?
D说:
1KB=1000Byte计算机里:
1KB=1024Byte7、⭐考试技巧
遇见:
数据存储
牢记:
计算机真正存储: 只有二进制!第一部分 第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写成十六进制:
12H3、第二个字节:
0011 0100合起来:
00110100就是:
34H4、所以为:
12H 34H答案:
C5、🎯知识点
一个字节:
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 最小 -1282、A为什么对?
快速求补码:
从右向左 找到第一个1 左边全部取反这是经典技巧。
3、C为什么对?
反码:
减法 可以变加法4、D为什么对?
反码:
+0 00000000还有
-0 11111111所以:
反码表示中,0有两种表示方式。5、🎯知识点
补码:
唯一一个0反码:
有两个0第一部分 第5题
《三把神秘钥匙——字符加密》
答案:
A。
1、🌈故事
(1)国王把秘密拆成三份:
第一份:
GESP第二份:
2026第三份:
| - ^ +只有三份合起来才能解密。
(2)分别计算:
①
'G' | 6ASCII:
G=7171|6 =71仍然:
G②
'E' 69 -2 =67 =C③
'S' 83^0 =83 =S任何数:
^0 都不变④
'P' 80 +2 = 82 R(3)得到:
GCSR答案:
A2、🎯知识点
小窍门:
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)我们先看看数组里面到底装了什么?
有的同学认为:
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()连字符串结束在哪里都不知道。
它会一直往后找:
直到碰巧找到一个‘\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、|0=x等性质 |
| 6 | 位运算 | 异或找唯一数、异或交换、~n=-n-1、左移乘2需不溢出 |
| 7 | 字符数组 | strcpy、strcat使用时必须保证目标数组空间足够,避免数组越界 |
这7题虽然都是选择题,但实际上对应的是三级考试中容易反复考查的基础概念。只有真正理解了这些故事背后的原理,后面的判断题和编程题也会轻松很多。