前言
整数的2进制表⽰⽅法有三种,即原码、反码和补码
有符号整数的三种表⽰⽅法均有符号位和数值位两部分,2进制序列中,最⾼位的1位是被当做符号位,剩余的都是数值位,符号位都是⽤0表⽰“正”,⽤1表⽰“负”
一、正整数的原、反、补码都相同
二、负整数的三种表⽰⽅法各不相同
一、原码
直接将数值按照正负数的形式翻译成⼆进制得到的就是原码
int main()
{
int num = -1;
// 一个 int 类型占4个字节,1个字节8个比特位
// 直接将数值按照正负数的形式翻译成⼆进制得到的就是原码
// 原码:10000000 00000000 00000000 00000001
return 0;
}
二、反码
将原码的符号位不变,其他位依次按位取反就可以得到反码
int main()
{
int num = -1;
// 一个 int 类型占4个字节,1个字节8个比特位
// 直接将数值按照正负数的形式翻译成⼆进制得到的就是原码
// 原码:00000000 00000000 00000000 00000001
// 将原码的符号位不变,其他位依次按位取反就可以得到反码
// 反码:01111111 11111111 11111111 11111110
return 0;
}
三、补码
反码+1就得到补码
补码与原码之间是可以相互转换的,补码取反,+1,就可以得到原码
int main()
{
int num = -1;
// 一个 int 类型占4个字节,1个字节8个比特位
// 直接将数值按照正负数的形式翻译成⼆进制得到的就是原码
// 原码:10000000 00000000 00000000 00000001
// 将原码的符号位不变,其他位依次按位取反就可以得到反码
// 反码:11111111 11111111 11111111 11111110
// 反码+1就得到补码
// 补码:11111111 11111111 11111111 11111111
// 补码取反,+1,就可以得到原码
// 补码取反:10000000 00000000 00000000 00000000
// +1:10000000 00000000 00000000 00000001 -1的原码
return 0;
}
4、为什么数据存放内存中存放的是补码
、 原因在于,使⽤补码,可以将符号位和数值域统⼀处理;同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路,其次补码与原码可以互相转换
// 这里举个例子
// 现在我需要在计算机中计算(1-1)的值
// 因为计算机中只能计算加法,所以实际上计算的是(1+(-1)))
// 假如使用原码计算
// 1 原码:00000000 00000000 00000000 00000001
// -1 原码:10000000 00000000 00000000 00000001
// 相加:10000000 00000000 00000000 00000010
// 可以看到相加后的结果等于-2了,与实际结果完全不同
// 假如使用补码计算
// (正整数的原、反、补码都相同)
// 1 补码:00000000 00000000 00000000 00000001
// -1 补码:11111111 11111111 11111111 11111111
// 相加:00000000 00000000 00000000 00000000
// 可以看到相加后的结果等于0,与实际结果完全相同
我们不用过多的去了解为什么计算机中数据存放内存中存放的是补码,因为这些知识都是计算机的前辈门为我们实践出来的宝贵财富,我们要知道,自己永远都是站在前辈的肩膀上前行的