谁说的正数的反码不变。通常来说,是正数没得反码和补码这一说,因为正数的编码都是原码,也就不存在正数的反码。将正数取反得到的结果是完全的另一个数。
数字编码方式无论哪种编码,都是为了代表一个数并且便于运算。我甚至可以指定00000001来代表数学上的2,00000010来代表5。我可以任意做影射关系,就像ASCII码一样,你说凭什么13就代表换行,10代表回车,我用5代表回车就不行?答案是当然行,如果你够牛,能改变标准就行。说白了就是一个影射而已,我想怎么影射都可以,只是前人已经制定了那样的标准,我们学习的时候,要试图去理解,前人为什么呀要那样制定标准,好处是什么。
假设2以一个字节存储,则其补码为:00000010(正数的原码和补码是一样的),则取反后得到11111101这么一个补码,将这个补码转换成原码得到的结果就是-3了。转换过程如下:
11111101--将该数减1求反码得 11111100--除符号位外每位取反求原码得10000011,最高位表示符号位
计算机内不是用原码表示的,它是用“补码”表示的
正数的反码=原码=补码,不等于按位取反。C语言内部的取反也不是“反码”。反码的定义是针对负数的,负数反码表示:1,符号位为1,2。除了符号位之外按位取反等于它的相反数。可见它和C语言的取反也不一样
取反不是说变成反码。
数字在计算机里是以补码的形式存储,2在计算机里是00000010,取反就是11111101,它也是个补码,符号位是1,所以是负数,相应的反码是11111100,原数是10000011,就是-3了。
所以2取反就是-3了。