黑马程序员技术交流社区

标题: 补码的三种求取方法小结 [打印本页]

作者: 刘艳伟    时间: 2012-11-15 10:33
标题: 补码的三种求取方法小结
本帖最后由 刘艳伟 于 2012-11-15 18:45 编辑

当将整型数据采用二进制表示时,正数用原码表示,负数用补码表示。最高位(左边的第一位)是符号位,用来区分正数或负数,正数使用原码表示,最高位是0,负数用补码表示,最高位是1。
如8的原码为:0000-0000 0000-0000 0000-0000 0000-1000

负数的补码有两种求取方法:
  第一种:对其原码逐位取反(除符号位外),然后整个数加1
  示例:
  如求取-8的补码:  
1、得到-8的原码:1000-0000 0000-0000 0000-0000 0000-1000
2、除符号位外逐位取反:1111-1111 1111-1111 1111-1111 1111-0111
3、加1既得-8的补码:1111-1111 1111-1111 1111-1111 1111-1000

  第二种:求出绝对值比其小1的数的原码,然后逐位取反既得
  示例:
  如求取-8的补码:
1、比-8绝对值小1的数为7
2、7的原码为:0000-0000 0000-0000 0000-0000 0000-0111
3、将其逐位取反既得-8的补码:1111-1111 1111-1111 1111-1111 1111-1000

  第三种:求出正数原码,将右边第一个1左边的所有位取反
  示例:
  如求-8的补码:
1、求出8的原码:0000-0000 0000-0000 0000-0000 0000-1000
2、从右边找到第一个1,将1左边的所有位取反,既得-8的补码:1111-1111 1111-1111 1111-1111 1111-1000


作者: jerry2627    时间: 2012-11-15 11:12
- 8 & 0xff
作者: 欧阳亚嗣    时间: 2012-11-15 14:13
我在学C的时候了解到的求补码的方法觉得很简单。
从右往左找到第一个 1。除了第一个1,左边所有位取反。
9:
0000-0000 0000-0000 0000-0000 0000-1001
-9:1111-1111 1111-1111 1111-1111 1111-0111
是LZ 方法的懒汉式。囧rz!

作者: 刘艳伟    时间: 2012-11-15 18:46
欧阳亚嗣 发表于 2012-11-15 14:13
我在学C的时候了解到的求补码的方法觉得很简单。
从右往左找到第一个 1。除了第一个1,左边所有位取反。
9 ...

我试了一下,挺方便的,谢谢了,我已经将这种方法加到帖子中了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2