- C++
原码反码补码教程
- @ 2025-3-13 20:59:40
在计算机中,为了更方便地处理有符号数(带正负号的数),引入了原码、反码和补码的概念。下面为你详细介绍:
基本概念
- 原码:是最直观的二进制表示方式,由符号位和数值位组成。最高位(最左边的位)是符号位,用0表示正数,1表示负数;其余位表示数值的大小。例如:
- 十进制数 +5 ,若用8位二进制原码表示 ,就是00000101(首位0是符号位,表明是正数,后面0000101是5的二进制表示)。
- 十进制数 -5 ,8位二进制原码是10000101(首位1是符号位,表示负数,后面依然是5的二进制表示) 。
- 反码:是在原码基础上得到的。规则是正数的反码与原码相同;负数的反码是在原码的基础上,符号位保持不变,其余数值位按位取反(0变1,1变0)。例如:
- 十进制数 +5 的反码,还是00000101(正数反码和原码一样)。
- 十进制数 -5 的原码是10000101,其反码就是11111010(符号位1不变,后面0000101变成1111010) 。
- 补码:是计算机中实际存储和处理有符号数的编码方式。规则为正数的补码与原码相同;负数的补码是在其反码的基础上,最低位加1。例如:
- 十进制数 +5 的补码,同样是00000101(正数补码、反码、原码都一致) 。
- 十进制数 -5 的反码是11111010,补码则是11111011(反码11111010最低位加1得到) 。
存在意义
- 原码:简单易懂,符合人类直观的数字表示习惯,但用原码进行加减法运算时,规则复杂,要根据符号位判断是做加法还是减法,不利于计算机硬件实现。例如计算5 + (-3) ,用原码计算时,要先判断符号,再进行操作。
- 反码:可看作是从原码到补码的过渡形式。在早期尝试简化运算的过程中出现,能在一定程度上简化运算,但仍存在一些问题,比如0有两种表示(+0的反码是00000000,-0的反码是11111111) 。
- 补码:解决了原码和反码在运算上的缺陷。一方面,使符号位和数值位能统一处理,在计算时无需单独处理符号位;另一方面,将减法运算转化为加法运算,比如计算5 - 3 ,可以转化为5 + (-3)的补码形式进行计算,简化了计算机硬件的运算电路设计。同时,0的补码表示唯一,都是00000000 。
相互转换
- 正数:原码、反码、补码的形式完全相同。比如十进制数 +8 ,8位二进制原码是00001000,反码和补码同样是00001000 。
- 负数:
- 原码转反码:符号位不变,其余数值位按位取反。如 -6 的原码是10000110,反码就是11111001。
- 反码转补码:在反码基础上,最低位加1。-6的反码11111001,补码就是11111010。
- 补码转原码:方法和负数原码转补码过程相反,即先减1得到反码,再将数值位取反(符号位不变) 。如已知补码11111010,减1得到11111009,再取反得到原码10000110 。
12 条评论
-
admin SU @ 2025-10-19 11:17:38
在计算机中,补码的核心作用之一就是将减法运算转化为加法运算,这是由补码的数学特性决定的。具体原理可以从“模运算”的角度理解:
1. 补码与模运算的关系
计算机中数字的表示范围是有限的(例如8位二进制数能表示0~255),这个范围的最大值加1就是“模”(对于8位无符号数,模=256)。
对于任意两个数a和b,减法a - b在模运算中可以等价于a + (模 - b),其中(模 - b)就称为b的“补数”。
例如:在模为12的时钟系统中,“减3”等价于“加9”(因为12-3=9),即5-3 = 5+9 = 14 → 14 mod 12 = 2,结果正确。2. 补码如何实现减法转加法
在有符号数的补码表示中:
- 正数的补码是其本身;
- 负数的补码 = 模 - 该数的绝对值(即负数的补码是其绝对值的“补数”)。
因此,计算
a - b时:- 可转化为
a + (-b); - 而
-b的补码就是b的补码的“补数”(即模减去b的补码); - 最终通过
a的补码 + (-b的补码),结果的补码再转回原数,即可得到减法结果。
3. 举例(8位二进制,模=256)
计算
5 - 3:- 转化为加法:
5 + (-3); - 5的补码:
00000101; - -3的补码:模 - 3 = 256 - 3 = 253 → 二进制
11111101; - 相加:
00000101 + 11111101 = 100000010,超出8位的部分(模)丢弃,结果为00000010(即2),正确。
总结
补码通过将负数表示为其“补数”,利用模运算的特性,使减法运算可以直接转化为加法运算,从而简化计算机硬件设计(只需加法器即可处理加减运算)。
-
@ 2025-8-13 10:37:03
数据编码(原码、反码、补码)考核试卷
一、选择题(每题3分,共30分)
-
对于8位二进制数,下列哪个是+0的原码表示? A. 00000000 B. 10000000 C. 01111111 D. 11111111
-
在8位二进制补码中,-1的表示形式是? A. 10000001 B. 11111110 C. 11111111 D. 00000001
-
下列关于反码的描述,正确的是? A. 正数的反码与原码不同 B. 负数的反码是对原码所有位取反 C. 反码可以解决0的表示不唯一问题 D. 负数的反码是符号位不变,数值位取反
-
8位二进制补码所能表示的整数范围是? A. -127 ~ +127 B. -128 ~ +127 C. -128 ~ +128 D. -127 ~ +128
-
若某数的补码是10000000,则该数的十进制值是? A. 0 B. -0 C. -128 D. 128
-
在计算机中,算术运算通常采用哪种编码方式? A. 原码 B. 反码 C. 补码 D. ASCII码
-
对于8位二进制数,下列哪个数的原码与补码相同? A. -1 B. -128 C. +32 D. -64
-
已知某数的原码是10101010,则其反码是? A. 01010101 B. 10101010 C. 11010101 D. 00101010
-
补码加法运算中,若结果的符号位为0而最高数值位产生进位,这表示? A. 结果为正且正确 B. 正溢出 C. 负溢出 D. 计算错误
-
8位二进制数中,下列哪个是-5的补码? A. 10000101 B. 11111010 C. 11111011 D. 00000101
二、填空题(每空2分,共20分)
-
原码由______和______两部分组成,其中______表示正数,______表示负数。
-
正数的反码与______相同,负数的反码是______不变,______取反。
-
补码解决了______问题,并且可以将______运算转化为______运算。
-
8位二进制中,-128的补码是______。
三、计算题(每题10分,共30分)
-
分别计算下列十进制数的8位原码、反码和补码: (1) +45 (2) -67 (3) +127 (4) -128
-
已知下列8位补码,求其对应的十进制数: (1) 00110101 (2) 11001010 (3) 10000000 (4) 01111111
-
用8位补码计算下列各式,并判断结果是否溢出: (1) 35 + 68 (2) 100 + 50 (3) -25 + (-45) (4) 60 - 30(提示:转化为加法运算)
四、简答题(每题10分,共20分)
1.详细说明为什么计算机中通常使用补码而不是原码或反码进行算术运算?原码和反码各自存在什么问题?
- 解释补码运算中溢出的概念,如何判断补码加法运算是否发生溢出?请举例说明。
-
-
@ 2025-8-5 19:13:35
除了8位二进制中的-128,其他位数的二进制编码也存在类似的特殊情况。这些特殊情况都源于补码的特性:利用原码/反码中"±0"占用的编码空间,多表示一个最小负数。
通用规律
对于n位二进制(1位符号位 + n-1位数值位):
- 原码和反码的表示范围:-(2^(n-1)-1) ~ +(2^(n-1)-1)
- 补码的表示范围:-2^(n-1) ~ +(2^(n-1)-1)
- 补码多表示的特殊值:-2^(n-1)(这个值没有原码和反码)
常见位数的特殊情况
1. 16位二进制
- 特殊值:-32768(-2^15)
- 补码:1000000000000000
- 原码:无(无法表示)
- 反码:无(无法表示)
- 原因:16位原码/反码最大只能表示-32767,补码利用"±0"的编码表示-32768
2. 32位二进制
- 特殊值:-2147483648(-2^31)
- 补码:10000000000000000000000000000000
- 原码:无
- 反码:无
- 应用:这是32位int类型的最小值(INT_MIN)
3. 64位二进制
- 特殊值:-9223372036854775808(-2^63)
- 补码:1000000000000000000000000000000000000000000000000000000000000000
- 原码:无
- 反码:无
- 应用:这是64位long long类型的最小值(LLONG_MIN)
验证程序
以下是扩展后的C++程序,可以验证任意位数的特殊情况:
#include <iostream> #include <string> #include <cmath> using namespace std; // 计算2的n次方(处理位运算) long long power_of_two(int n) { return 1LL << n; // 使用long long避免溢出 } // 检查是否为补码特殊值(-2^(bits-1)) bool is_special_value(int n, int bits) { return (n == -power_of_two(bits - 1)); } // 获取原码 string get_original_code(int n, int bits) { // 特殊值没有原码 if (is_special_value(n, bits)) { return "无原码(补码特殊值)"; } int max_abs = power_of_two(bits - 1) - 1; if (abs(n) > max_abs) { return "无原码(超出范围)"; } string code; code += (n >= 0) ? '0' : '1'; int num = abs(n); string num_str; if (num == 0) { num_str = "0"; } else { while (num > 0) { num_str = (num % 2 == 0 ? "0" : "1") + num_str; num /= 2; } } if (num_str.length() < bits - 1) { num_str = string(bits - 1 - num_str.length(), '0') + num_str; } return code + num_str; } // 获取反码 string get_one_complement(int n, int bits) { // 特殊值没有反码 if (is_special_value(n, bits)) { return "无反码(补码特殊值)"; } string original = get_original_code(n, bits); if (original.find("无原码") != string::npos) { return "无反码(超出范围)"; } if (original[0] == '0') { return original; } for (int i = 1; i < original.length(); i++) { original[i] = (original[i] == '0' ? '1' : '0'); } return original; } // 获取补码 string get_two_complement(int n, int bits) { // 处理补码特殊值 if (is_special_value(n, bits)) { return "1" + string(bits - 1, '0'); } int max_positive = power_of_two(bits - 1) - 1; int min_negative = -power_of_two(bits - 1); if (n < min_negative || n > max_positive) { return "无补码(超出范围)"; } if (n >= 0) { return get_original_code(n, bits); } string one_comp = get_one_complement(n, bits); int carry = 1; for (int i = one_comp.length() - 1; i >= 1 && carry; i--) { if (one_comp[i] == '1') { one_comp[i] = '0'; } else { one_comp[i] = '1'; carry = 0; } } return one_comp; } // 打印编码信息 void print_codes(int n, int bits) { if (bits < 2) { cout << "错误:位数必须至少为2" << endl << endl; return; } cout << bits << "位下的" << n << ":" << endl; cout << "原码:" << get_original_code(n, bits) << endl; cout << "反码:" << get_one_complement(n, bits) << endl; cout << "补码:" << get_two_complement(n, bits) << endl; long long min_val = -power_of_two(bits - 1); long long max_val = power_of_two(bits - 1) - 1; cout << "补码表示范围:" << min_val << " ~ " << max_val << endl << endl; } int main() { // 测试不同位数的特殊情况 print_codes(-128, 8); // 8位特殊值 print_codes(-32768, 16); // 16位特殊值 print_codes(-2147483648, 32); // 32位特殊值(注意:需64位编译器支持) print_codes(-4, 3); // 3位特殊值(-4) print_codes(-8, 4); // 4位特殊值(-8) return 0; }总结
所有位数的补码都遵循同一规律:
- 对于n位二进制,补码能表示的最小值是-2^(n-1)
- 这个最小值没有对应的原码和反码
- 补码的表示形式固定为:1后面跟n-1个0(100...000)
这种设计使得补码在相同位数下能表示比原码/反码更大的数值范围,同时解决了0的表示不唯一问题,这也是计算机系统普遍采用补码的根本原因。
-
@ 2025-8-5 10:15:01
计算两个数相加时,使用补码运算无需考虑符号位。(√)
解析:在补码运算中,符号位可以与数值位一起参与加法运算,不需要单独处理符号。运算结束后,符号位自然会反映结果的正负:
- 若结果符号位为0,表示正数
- 若结果符号位为1,表示负数
例如:
- 计算 3 + (-2)
- 3的8位补码:00000011
- -2的8位补码:11111110
- 相加结果:00000001(符号位为0,结果为+1,正确)
这种特性使得补码非常适合计算机硬件实现,无需设计专门的符号处理电路,简化了运算逻辑。但需要注意的是,补码运算仍需判断是否发生溢出。
-
@ 2025-8-5 10:09:42
在8位二进制中,-128的原码和反码不存在,只有补码有明确的表示形式,具体如下:
-
原码:无法表示
8位原码的结构是"1位符号位+7位数值位",最大能表示的负数是-127(11111111)。
若尝试表示-128,需要7位数值位表示128,但7位二进制最大只能表示127(1111111),因此-128没有8位原码。 -
反码:无法表示
反码是在原码基础上推导的(负数反码=符号位不变+数值位取反)。
由于-128没有原码,自然也不存在对应的反码。 -
补码:10000000
补码通过"负数补码=反码+1"的规则,利用了原码和反码中"±0"占用的额外编码(10000000)来表示-128,这是补码的特殊规定。
总结:8位二进制中,-128只有补码(10000000),没有原码和反码。这也是补码表示范围(-128~+127)比原码/反码(-127~+127)大1的原因。
-
-
@ 2025-8-5 10:08:19
补码表示的数值范围比原码和反码表示的数值范围大。(√)
解析:以8位二进制数为例:
- 原码的表示范围是-127~+127
- 反码的表示范围是-127~+127
- 补码的表示范围是-128~+127
补码多表示了一个最低负数(如8位中的-128),这是因为补码中0只有一种表示形式(00000000),而原码和反码中0有两种表示形式(+0和-0),补码利用节省下来的这个编码表示了一个更低的负数,因此补码的表示范围更大。
-
@ 2025-8-5 9:56:58
数据编码是计算机中表示数字的基础方式,原码、反码和补码是机器数的三种常见表示形式。下面为你详细介绍这三种编码的概念及生成方法:
原码
原码是最简单的机器数表示法,由符号位和数值位两部分组成:
- 符号位:用0表示正数,1表示负数
- 数值位:将十进制数的绝对值转换为二进制表示
生成方法:
- 确定数值的正负,设置符号位(0为正,1为负)
- 将数值的绝对值转换为二进制
- 不足指定位数时,在数值位前面补0
示例:
- 假设用8位表示:
- +10的原码:00001010(符号位0,数值位0001010)
- -10的原码:10001010(符号位1,数值位0001010)
反码
反码是为了解决原码运算问题而引入的,其表示方法与原码相关:
- 正数的反码与原码相同
- 负数的反码是对原码的数值位逐位取反(0变1,1变0),符号位保持不变
生成方法:
- 先求出该数的原码
- 若为正数,反码与原码相同
- 若为负数,保持符号位不变,将数值位的每一位取反
示例:
- 用8位表示:
- +10的原码:00001010 → 反码:00001010
- -10的原码:10001010 → 反码:11110101(数值位取反)
补码
补码是计算机中最常用的表示方法,它解决了负数加法运算的问题:
- 正数的补码与原码、反码相同
- 负数的补码是其反码加1
生成方法:
- 先求出该数的反码
- 若为正数,补码与反码相同
- 若为负数,补码 = 反码 + 1(二进制加法)
示例:
- 用8位表示:
- +10的反码:00001010 → 补码:00001010
- -10的反码:11110101 → 补码:11110110(反码加1)
为什么需要这三种编码?
- 原码:直观易懂,但进行减法运算时复杂
- 反码:解决了部分运算问题,但存在+0和-0的问题
- 补码:彻底解决了0的表示唯一性问题,且能将减法运算转化为加法运算,是计算机中实际使用的编码方式
-
@ 2025-8-5 9:08:30
小朋友,今天我们来学习计算机里很有趣的知识哦,就是数据编码中的原码、反码和补码,它们就像是数字在计算机里的不同“衣服”呢。
原码生成
原码是最容易理解的一种编码啦。计算机里用二进制来表示数字,二进制就是只用0和1来表示哦。原码呢,就是由符号位和数值位组成的,符号位就像数字的“正负标志”,用0表示正数,1表示负数,数值位就是这个数字本身的二进制表示啦。
- 正数原码:比如十进制的数字5,我们要把它变成8位的原码。先把5变成二进制,是101。因为是正数,符号位是0,然后在101前面补上足够的0,让它变成8位,就是00000101啦。
- 负数原码:再比如 -5,同样先把5变成二进制101,因为是负数,符号位变成1,所以 -5的8位原码就是10000101哦。
反码生成
反码呢,是在原码的基础上变来的哦。
- 正数反码:正数的反码和原码是一样的哦。就像刚才的5,原码是00000101,反码也是00000101啦。
- 负数反码:负数的反码要把原码的符号位保留,数值位的0变成1,1变成0哦,这就叫按位取反。比如 -5的原码是10000101,把数值位0000101按位取反,变成1111010,再加上符号位1,所以 -5的反码就是11111010啦。
补码生成
补码是计算机里常用的一种编码哦,它能让计算机计算起来更方便呢。
- 正数补码:正数的补码也和原码、反码是一样的哦。还是拿5举例,它的补码也是00000101啦。
- 负数补码:负数的补码要先算出它的反码,然后在反码的基础上加上1哦。比如 -5,反码是11111010,加上1后,就变成了11111011,这就是 -5的补码啦。
小朋友,你学会了吗?可以自己试着把10和 -10变成原码、反码和补码哦,这样就能记得更牢啦。
-
@ 2025-3-13 21:21:45
选择题
- 十进制数 +10 的 8 位原码是( ) A. 00001010 B. 10001010 C. 00010100 D. 10010100
- 十进制数 -15 的 8 位反码是( ) A. 10001111 B. 11110000 C. 11110001 D. 01110000
- 十进制数 -20 的 8 位补码是( ) A. 10010100 B. 11101100 C. 11101011 D. 01101100
- 已知一个数的 8 位补码是 11110000,其对应的十进制数是( ) A. -16 B. -15 C. 15 D. 16
- 若采用 8 位二进制补码表示整数,其表示范围是( ) A. -128 到 127 B. -127 到 127 C. -128 到 128 D. -127 到 128
- 正数的原码、反码和补码( ) A. 各不相同 B. 原码和反码相同,与补码不同 C. 原码和补码相同,与反码不同 D. 三者都相同
- 在计算机中,通常使用( )来表示和存储数值。 A. 原码 B. 反码 C. 补码 D. 以上都不是
- 计算 5 + (-3) 时,使用补码运算,5 的 8 位补码是 00000101, -3 的 8 位补码是 11111101,相加结果的 8 位二进制是( ) A. 00000010 B. 10000010 C. 00000110 D. 11111110
- 一个 8 位二进制数的原码是 11111111,其对应的十进制数是( ) A. -127 B. -128 C. 127 D. 128
- 以下关于 0 的原码、反码和补码表示,正确的是( ) A. 原码和反码有两种表示,补码只有一种表示 B. 原码、反码和补码都有两种表示 C. 原码和补码有两种表示,反码只有一种表示 D. 原码、反码和补码都只有一种表示
判断题
- 原码的符号位用 0 表示正数,1 表示负数。( )
- 负数的反码是在原码基础上,所有位按位取反。( )
- 正数的补码与原码相同,负数的补码是在反码基础上最低位加 1。( )
- 计算机在进行数值运算时,使用原码可以简化运算逻辑。( )
- 若一个 8 位二进制补码是 00000000,其对应的十进制数是 0。( )
- 反码解决了 0 的两种表示问题。( )
- 在 8 位二进制补码表示中, -128 的补码是 10000000。( )
- 计算两个数相加时,使用补码运算无需考虑符号位。( )
- 一个数的原码和反码不可能相同。( )
- 补码表示的数值范围比原码和反码表示的数值范围大。( )
答案
选择题答案
- A
- B
- B
- A
- A
- D
- C
- A
- A
- A
判断题答案
- √
- ×(负数的反码是符号位不变,其余数值位按位取反)
- √
- ×(计算机使用补码可以简化运算逻辑)
- √
- ×(补码解决了 0 的两种表示问题)
- √
- √
- ×(正数的原码和反码相同)
- √
-
@ 2025-3-13 21:03:30
下面为你提供原码、反码和补码在不同数值及运算场景下的具体实例。
单个数值的原码、反码和补码表示
为了方便说明,下面以 8 位二进制数为例。
正数情况
以十进制数 +18 为例:
- 原码:符号位为 0 表示正数,数值位为 18 的二进制表示 0010010,补齐到 7 位后为 0010010,所以 +18 的 8 位原码是 00010010。
- 反码:正数的反码与原码相同,因此 +18 的反码也是 00010010。
- 补码:正数的补码同样与原码相同,所以 +18 的补码还是 00010010。
负数情况
以十进制数 -25 为例:
- 原码:符号位为 1 表示负数,数值位为 25 的二进制表示 0011001,补齐到 7 位后为 0011001,所以 -25 的 8 位原码是 10011001。
- 反码:负数的反码是在原码基础上,符号位不变,数值位取反,得到 11100110。
- 补码:负数的补码是在反码基础上最低位加 1,即 11100110 + 1 = 11100111。
原码、反码和补码在运算中的实例
原码运算问题
计算 5 + (-3),使用原码进行计算:
- 5 的 8 位原码是 00000101。
- -3 的 8 位原码是 10000011。 在原码运算时,计算机需要先判断符号位,然后进行相应的加法或减法操作。这里进行加法时,由于符号不同,实际要做减法 5 - 3,这增加了运算的复杂性。
补码运算优势
同样计算 5 + (-3),使用补码进行计算:
- 5 的 8 位补码是 00000101(正数补码与原码相同)。
- -3 的 8 位原码是 10000011,反码是 11111100,补码是 11111101。 将两个补码相加:00000101 + 11111101 = 100000010,由于是 8 位运算,最高位的进位 1 溢出舍弃,结果为 00000010,转换为十进制就是 2,与实际计算结果相符。而且在补码运算中,无需单独处理符号位,直接进行加法运算即可,简化了计算机的运算逻辑。
特殊数值 0 的表示
原码
在原码表示中,0 有两种表示形式:
- +0 的 8 位原码是 00000000。
- -0 的 8 位原码是 10000000。
反码
反码中 0 也有两种表示形式:
- +0 的 8 位反码是 00000000。
- -0 的 8 位反码是 11111111。
补码
补码解决了 0 的两种表示问题,0 只有一种表示形式:
- 0 的 8 位补码是 00000000。
超出表示范围的情况(溢出)
假设使用 4 位二进制补码表示数值,其表示范围是 -8 到 7。 计算 5 + 3:
- 5 的 4 位补码是 0101。
- 3 的 4 位补码是 0011。 两数相加:0101 + 0011 = 1000,按照补码规则,1000 表示 -8,这显然是错误的结果,原因是 5 + 3 = 8 超出了 4 位补码所能表示的范围,产生了溢出。
通过以上实例,可以更深入地理解原码、反码和补码的特点以及它们在计算机中的应用。
-
@ 2025-3-13 21:01:12
在计算机系统中,数值一律用补码来表示和存储,原因主要有以下两点:
- 统一处理符号位和数值域:补码的表示方式使得符号位和数值位可以统一处理,在进行运算时无需像原码那样对符号位单独进行判断和操作 。例如,在加法运算中,不管参与运算的数是正数还是负数,都可以直接按照补码形式进行相加。
- 统一加减法运算:使用补码可以将减法运算转化为加法运算。在一定的模运算体系下,减去一个数等同于加上这个数的补码,这样计算机硬件中只需要设计加法电路就可以实现加减法运算,简化了硬件设计。
原码和反码通常并不直接用于数据的存储,它们更多是作为计算补码的过渡形式:
- 原码:是一种简单直观的二进制表示方式,由符号位和数值位组成,最高位(最左边的位)为符号位,0表示正数,1表示负数,其余位表示数值的大小。比如8位二进制中,+5的原码是00000101,-5的原码是10000101 。但原码在进行加减法运算时,需要根据符号位判断是做加法还是减法,这不利于计算机硬件实现。
- 反码:正数的反码与原码相同;负数的反码是在原码的基础上,符号位保持不变,其余数值位按位取反(0变1,1变0)。例如+5的反码是00000101,-5的原码是10000101,其反码是11111010 。反码可看作从原码到补码的过渡形式,虽然在一定程度上简化了运算,但仍存在一些问题,如0有两种表示(+0的反码是00000000,-0的反码是11111111)。
-
@ 2025-3-13 21:00:37
原码、反码、补码超通俗教程(0基础+大量实例)
一、为啥需要原码、反码、补码?
计算机要处理带正负的数(如 +5、-3),但直接用二进制表示负数,运算会很麻烦。于是设计了原码、反码、补码,让计算机更高效处理有符号数,尤其是补码,让加减法运算规则统一,硬件实现更简单。
二、原码:最直观的二进制表示
规则
- 符号位:最高位(最左边),0 表示正数,1 表示负数。
- 数值位:剩下的位表示数的大小,直接写十进制数的二进制形式。
实例
- 正数:+7(8位二进制)
原码:00000111(首位 0 是符号位,0111是 7 的二进制)。 - 负数:-10(8位二进制)
原码:10001010(首位 1 是符号位,1010是 10 的二进制)。
三、反码:过渡性编码
规则
- 正数:反码 = 原码。
- 负数:符号位不变,其余数值位“0变1,1变0”(按位取反)。
实例
- 正数:+12 原码是
00001100,反码也是00001100。 - 负数:-4 原码
10000100,反码:
符号位 1 不变,其余取反 →11111011。
四、补码:计算机真正存储的编码
规则
- 正数:补码 = 原码 = 反码。
- 负数:反码的基础上,最低位加 1。
实例
- 正数:+3 补码
00000011(和原码一样)。 - 负数:-6
原码:10000110→ 反码:11111001→ 补码:11111010(反码最低位加 1)。
五、三码转换详细操作
1. 正数转换
- 原码、反码、补码完全相同。
例:+15(8位)
原码:00001111→ 反码:00001111→ 补码:00001111。
2. 负数转换
- 原码→反码:符号位不变,数值位取反。
例:-9 原码10001001→ 反码11110110。 - 反码→补码:反码最低位加 1。
例:反码11110110→ 补码11110111。 - 补码→原码:补码先减 1 得反码,再数值位取反(符号位不变)。
例:补码11110111→ 减 1 得反码11110110→ 原码10001001。
六、补码的神奇应用:统一加减法
计算机用补码运算,减法变加法!
例:计算 5 - 3(即 5 + (-3))- 5 的补码:
00000101 - -3 的补码:
11111101 - 相加:
00000101 + 11111101 = 100000010(舍去最高位 1,结果00000010,即十进制 2,正确!)
通过补码,计算机无需区分加减法,硬件电路设计更简单,这就是补码的核心价值!
- 1