带符号整数

多数平台使用补码表示带符号整数。

1.带符号数值
最高位(最左侧)是符号位,正数是0,负数是1。
00000000 = +0
10000000 = -0

使用带符号数值的数字的数学运算是复杂的,因为简单的带符号整数的加法和减法不能按照无符号数字的方式进行。如:
00000001(十进制1) 和 10000001 (十进制-1) 相加得到 10000010 (十进制-2),这是不正确的。

2.反码
反码方法采用无符号整数的相反代码生成相应的负值。求反把所有为0的位改变为1,把所有为1的位改变为0。
00000001 的反码是 11111110 。

同样,对于带符号数字,当执行数学操作时,反码数字会产生一些问题。有两种方式可以表示零值(00000000 和 11111111),反码数字的数学运算也是复杂的(它不允许进行标准二进制运算)。

3.补码
补码通过使用简单的数学技艺,解决了带符号数值和反码方法的数学运算问题。对于负整数数值,值的反码加上1就是它的补码。
如:-1
1) 得到 00000001 的反码,结果是 11111110
2) 反码加上1,结果是 11111111

对-2值进行相同处理,会得到 11111110 ,-3 会得到 11111101 。

补码值从 11111111 (十进制-1) 开始递减,直到到达 10000000 , 它表示 -128 。对于多字节整数长度,规则相同。

虽然这样看上去有些奇怪,但是它解决了带符号整数的加法和减法的所有问题。如
值 00000001 (+1) 和 (11111111) (-1) 相加得到 00000000 ,并且带有进位值。在整数运算中进位值被忽略,所以最终的值确实是0。相同的硬件可以同时用于无符号值和带符号值的加法和减法操作。

对于相同的位数,补码格式表示的值和数量和无符号整数对应的值的数量是相同的,但是必须把值分为正值和负值。因些,带符号整数的最大值是无符号值的一半。


0xdcff
1101 1100 1111 1111        
1010 0011 0000 0000        反码
1010 0011 0000 0001        补码, 除掉符号位,-8961

你可能感兴趣的:(Assembly,linux)