1.引入问题
你已经困惑了很久,你明明知道
补码就是按位取反,然后加一
,但是你想知道的,不是它怎么求滴,而是,它怎来滴。当然,对于阅读这篇文章的你,既然想要知道这个答案,一定是有一定编程基础的读者,肯定知道补码与有符号数与无符号数的关系(有符号数指带有正负号的数,无符号可以理解为只大于0的数),你所查阅的所有资料首先都会用一个8位的二进制数给你举例,ok,我们也用一个8位的二进制数。
2.补码的来源
8位二进制数,最小
00000000
,最大数11111111
,换算十进制为0 ~ 255,当然,所有的参考资料都会这样讲,而且这也不是你想要的,但我们必须说下去。1 ~ 255,一共255的字符,再加上最前面的0,一共256个字符。
现在,我们要用一个8位二进制数字来表示一个负数,可是二进制里没有负号,谁都知道二进制里只有0,1,再无其他符号。那么所以我们必须用一种方式来代替正负,也就是我们规定,当然是人规定的,而不是电脑,我们规定这个8位的二进制数的最前面一位数来表示这个数的正负,0代表是正,1代表是负。
那么当第一位是0时,我们一共可以表示00000000 ~ 01111111这么多正数,因为第一位必须是0来代表正数;当第一位是1时,我们一共可以表示10000000~11111111这么多负数,然后,我们用00000000 ~ 01111111来代表0 ~ 127,那岂不是10000000~11111111代表 -0 ~ -127??可是网上都说不能有 负0,可是我觉的没什么不妥啊,负0不还是0 吗?10-0=10,不就是相当于10+(-0)=10吗,现在我们不讨论正负0的问题,我们来讨论一个小学生的问题: