原码、反码、补码是CSP-J初赛必考的知识点几乎每年都有1-2道选择题分值约2-4分。下面我从概念→转换→典型例题完整梳理。一、为什么要学这三种编码计算机内部只能存储0和1二进制所以需要用二进制来表示数字。但数字有正数和负数如何用二进制表示负数三种编码方式应运而生原码、反码、补码。结论计算机中存储和运算都是用补码原码和反码只是理解补码的中间步骤。二、三种编码的定义2.1 原码Sign-Magnitude定义最高位表示符号0正1负其余位表示数值的绝对值。十进制原码8位50 0000101-51 000010100 0000000-01 0000000特点直观易懂人一眼能看出大小有两个00和-0浪费了一个编码减法无法直接用加法器实现需要额外处理符号位2.2 反码Ones Complement定义正数反码 原码负数反码 原码符号位不变其他位取反十进制原码8位反码50 00001010 0000101-51 00001011 111101000 00000000 0000000-01 00000001 1111111特点正数不变负数按位取反仍然有两个00和-0减法可以通过加法实现但需要循环进位2.3 补码Twos Complement★★★★★定义正数补码 原码反码负数补码 反码 1更快的口诀原码取反再加一针对负数十进制原码反码补码50 00001010 00001010 0000101-51 00001011 11110101 111101100 00000000 00000000 0000000-01 00000001 11111111 00000000溢出仍为0特点必须背住只有1个0解决了两个0的问题减法可以用加法器统一实现计算机中实际存储和运算用的就是补码8位补码的范围-128 ~ 127三、三者对比速查表编码方式正数表示负数表示0的个数范围8位是否用于存储原码符号位0绝对值符号位1绝对值2个0和-0-127 ~ 127❌反码同原码符号位不变其余取反2个0和-0-127 ~ 127❌补码同原码反码11个只有0-128 ~ 127✅四、转换方法手把手教学4.1 正数原码 反码 补码例5 的 8位原码、反码、补码5的二进制101补成8位00000101原码00000101反码00000101补码000001014.2 负数三步法步骤写出正数的原码 → 取反符号位不变→ 加1例求 -5 的 8位补码5 的原码00000101取反符号位不变11111010反码加111111011补码答案-5的补码 111110114.3 从补码还原为十进制步骤看最高位符号位0 → 正数直接转十进制1 → 负数继续下面补码减1 → 反码反码取反符号位不变→ 原码转十进制加负号例已知 8位补码11111011求十进制最高位为1 → 负数减111111011 - 1 11111010反码取反10000101原码 -5答案-5快速法更常用已知补码11111011符号位为1取反包括符号位00000100加100000101 5加负号-5口诀补码取反加一得到绝对值针对负数五、补码的加减法核心应用5.1 核心公式5.2 溢出判断理解即可CSP-J常考情况判断方法正正负结果符号位为1 → 正溢出负负正结果符号位为0 → 负溢出正负不会溢出六、CSP-J 典型例题例题1基本转换题目-6 的 8位二进制补码是 A. 11111010 B. 11111001 C. 11111011 D. 10000110答案A解析6 的8位二进制00000110取反11111001反码加111111010补码选A。例题2补码还原题目8位补码11100101表示的十进制数是 A. 229 B. -27 C. -26 D. -25答案B解析最高位为1 → 负数方法1传统法减111100101 - 1 11100100反码取反00011011原码 27加负号-27方法2快速法取反包括符号位00011010加100011011 27加负号-27选B。例题3补码加法题目计算-5 3用8位补码表示结果是 A. 11111110 B. 11111101 C. 11111100 D. 11111010答案A解析-5 的补码111110113 的补码00000011相加11111011 00000011 ----------- 11111110 补码结果还原11111110最高位为1 → 负数取反00000001加100000010 2结果 -2-5 3 -2✓选A。例题4表示范围题目8位补码可以表示的整数范围是 A. -127 ~ 127 B. -128 ~ 127 C. -127 ~ 128 D. -128 ~ 128答案B解析8位补码最高位符号位剩余7位表示数值正数最大01111111 127负数最小10000000 -128单独记忆范围-128 ~ 127选B。例题5特殊值的补码题目8位补码10000000表示的十进制数是 A. -0 B. -127 C. -128 D. 128答案C解析10000000是8位补码的最小值表示 -128。这是补码的一个特殊规定00000000 010000000 -128选C。例题6判断是否为补码题目以下哪个 8位二进制数不是合法的补码表示 A. 01111111 B. 10000000 C. 10000001 D. 11111111答案全部都合法解析8位补码可以表示 -128 ~ 127所有 00000000 ~ 11111111 都是合法的补码表示。01111111 12710000000 -12810000001 -12711111111 -1所以全部合法。如果题目改为以下哪个不是8位补码能表示的数答案可能是 128 或 -129。例题7混合运算题目已知 x 的补码为11110111y 的补码为00001010则 xy 的补码是 A. 00000001 B. 00000010 C. 11111111 D. 11111110答案A解析11110111 00001010 ----------- 00000001 忽略进位补码相加的结果就是 xy 的补码。选A。例题8程序阅读题题目阅读以下程序输出结果是 cppchar a 128; cout (int)a;A. 128 B. -128 C. 127 D. 0答案B解析char 在C中默认是 signed char范围 -128 ~ 127128 超出了 char 的范围128 的二进制10000000作为 char 存储时10000000被解释为补码等于 -128选B。例题9位数拓展题目8位补码10000001扩展为16位后是 A. 0000000010000001 B. 1111111110000001C. 0000000000000001 D. 1111111111111111答案B解析补码的位数扩展要补符号位符号扩展10000001最高位是 1负数扩展为16位11111111 10000001选B。例题10取反运算题目对 8位补码00001111按位取反~后表示的十进制数是 A. 240 B. -16 C. -15 D. 15答案B解析00001111 15按位取反1111000011110000是补码最高位为1 → 负数取反00001111加100010000 16结果 -16选B。七、题型分类速查题型考点例题编号十进制 → 补码原码取反加一例题1补码 → 十进制取反加一得绝对值例题2补码加法直接二进制相加例题3,7表示范围8位补码 -128~127例题4,6特殊值10000000 -128例题5类型溢出char存储128 -128例题8位数拓展符号扩展例题9位运算按位取反例题10八、考前速记卡核心公式负数补码 原码取反符号位不变 1 正数补码 原码 反码8位补码特殊情况00000000 0 01111111 127 10000000 -128 11111111 -1 10000001 -127常见数值的8位补码十进制补码00000000010000000112701111111-111111111-12810000000-12710000001九、实战检测6题自测题号题目你的答案1-9 的 8位补码是 28位补码11110000表示的十进制是 38位补码可表示的最大数是 48位补码10101010扩展为16位是 5~1在8位补码下等于 6char a 200; 输出 (int)a 是 11110111900001001→取反11110110→111110111-1611110000→取反00001111→10001000016加负号-16127011111111111111110101010符号扩展-2100000001取反11111110-2-56200的二进制11001000作为char补码-56最后建议原码、反码、补码的题目是送分题关键在于多练手算。把原码取反加一和补码取反加一得绝对值这两句口诀刻在脑子里再配合8位补码范围 -128~127这个关键结论这部分的分数一定能拿满。考试时遇到这类题先在草稿纸上写出二进制按步骤转换千万不要跳步。