在介绍原码、反码和补码的概念之前,有没有想过数据在内存中是如何存放的呢?
是不是定义一个a变量,赋个20给它,它在内存中就存了个20呢?
我们不妨用VS2019的调试窗口来看一下,下面的代码存放的地址。
int main()
{
int a = 20;
int b = -10;
return 0;
}
查看a的地址存放的数值,是一个十六进制数:14 00 00 00,看到这里我非常惊讶我不是赋值20吗?为什么是这么个东西。
再查看a的地址存放的数值,也是一个十六进制数:f6 ff ff ff
到底是怎么存的?使20存成14 00 00 00,-10存成f6 ff ff ff呢?
原码、反码和补码
计算机中的有符号数有三种表示方法,即原码、反码和补码。有符号数分为正数和负数。
三种表示方法均有符号位和数值位两部分,第一位是符号位,都是用0表示“正”,用1表示“负”,而数值位三种表示方法各不相同。
注:无符号数也有原码、反码和补码。只不过无符号数的原码、反码和补码是相同的。
正数的原码、反码和补码
有符号正数的原码、反码和补码三者相同。
10 原 码 = 10 反 码 = 1