n bit有符号数范围是-2^n ~ 2^n -1
例如8bit有符号数:-128 ~ +127,及其原码补码,本文会非常清楚地讲一下这个范围是怎么来的以及它们的原码补码
最高位为符号位,0代表正数,1代表负数,正数原码和补码相同,负数的补码是原码符号位不变其他位取反,再+1,
讲计算规则会一头雾水,用列表的形式给出会清晰很多:
值, 原码(正数补码等于原码)
+127, 0111 1111
+126, 0111 1110
+125, 0111 1101
……
+4, 0000 0100
+3, 0000 0011
+2, 0000 0010
+1, 0000 0001
0, 0000 0000 (不区分正负)
值,原码,符号位不变各位取反, 然后+1(即补码)
-1, 1000 0001, 1111 1110, 1111 1111
-2, 1000 0010, 1111 1101, 1111 1110
-3, 1000 0011, 1111 1100, 1111 1101
……
-124, 1111 1100, 1000 0011, 1000 0100
-125, 1111 1101, 1000 0010, 1000 0011
-126, 1111 1110, 1000 0001, 1000 0010
-127, 1111 1111, 1000 0000, 1000 0001
-128, 1000 0000, 1111 1111, 1000 0000
(1)-128的原码: 从-127的数据位(第0~6位)+1而来,进位被丢弃
(2)-128符号位不变各位取反,得到1111 1111
(3)然后+1得到补码,数据位+1之后,全变为0,进位被丢弃,注意:进位不加到符号位上。
(4)-128的原码看起来是-0,可以这么不确切地通俗地说:用+0表示0,用-0表示-128
(5)计算机中负数用补码来存,正是因为用补码来存,所以存着的数从-128一直到+127看起来是很有规律的:
-128, -127, -126, … , -2, -1, 0, +1, … , +126, +127
1000 0000, 1000 0001, 1000 0010, …,1111 1110, 1111 1111, 0000 0000, 0000 0001, …, 0111 1110, 0111 1111
可能写的不对齐,下面是图片:
这样看起来就是直接从1000 0000一直+1(进位加到符号位上),一直加到0111 1111,再加就又变为1000 0000了
- 之前说的进位不加到符号位上,是我们定义的从原码计算补码的规则,这个规则就是进位不加到符号位上。
- 这里说的从1000 0000 一直+1并且进位加到符号位上,是说从计算机内部储存数据的方式来看,可以看成是这样的一种形式,并且这种形式很有规律。
- 有可能在发明之初,就直接让数字从1000 0000到0111 1111排好,然后我们定义前128个数字为-128到-1,后128个数字为0到+127,在这基础上,再发展而来对于符号位,原码,补码的定义。
——————————————————————————————