网友提问:
为什么数据在内存里是以补码的形式存储?正数好理解,就是其本身.负数为何不能直接第一位1表示负,其后部分就按照正数表示.比如12345和-12345二进制表示只是第一位一个是0一个是1,后面15位一样.初学c语言不太了解其中的原因.
老师回答:
补吗是为了加减运算才出现的.我们都知道如果加一个负数,只要减去他对应的正数即可,
如 3+(-1)=3-1=2
计算机很笨,没这种思维,他加法就是加法
3+(-3) 如果按你的方法表示负数 结果时 0x03+0x83=0x86 显然不是0,因为计算机不会把加法变成减法.
那另一种就是取补吗,0x03+0xfd=0x00 这样就符合运算规则,这就是为什么要有补吗,-1 必须要比-2 在代码上大1,
如果只是把首位变成1 ,那仍然不符合这个规则,0x01 0x02如果只是首位变符号,结论是 0x81 小于 0x82 这就是一个错误 -1
我的实验:
3 正数,用原码表示 0000 0011
-3 负数,如果用上面那说法,首位用1表示负数则为 1000 0011
0000 0011
+1000 0011
=1000 0110 =>132  结果为132明显不对
所以要用补码表示负数
-3
原码 0000 0011
取反 1111 1100
+1 1111 1101
3 : 0000 0011
-3 : 1111 1101
和: 1 0000 0000
溢出了,仍为0, 确实很妙,太佩服创造计算机这帮人了。

Comments are closed.

Post Navigation