浅谈补码与二进制加法

1、C语言之父,谭浩强老司机曾经教导我们,正数在计算机中的二进制表示,原码、反码、补码都是相同的,等于原码。

2、负数在计算机中,以其补码的形式表示。

3、以signed short举例,为什么计算机中,它的范围是-32768~32767呢,负数怎么比正数多了一个呢?

      我们知道,signed short 16位中,第一位是用于表示符号的,0表示正,1表示负。

      比如:-2,原码为1000 0000 0000 0010

 反码为 1111 1111 1111 1101

 补码为 1111 1111 1111 1110

4、我们来看一个特殊的数+0和-0。

      +0的二进制形式为:0000 0000 0000 0000;现在我们看-0的二进制表示

      -0的原码:1000 0000 0000 0000

      -0的反码:1111 1111 1111 1111

      -0的补码: 0000 0000 0000 0000

我们得到:+0和-0的补码是相同的都是0000 0000 0000 0000

1000 0000 0000 0000 表示-32768,多出了一个编码,并且消除了+0和-0的差异,多伟大的创作啊!

5、-32768 - 1等于多少呢?

      我们已经知道-32768用1000 0000 0000 0000 表示,那么减去1呢?

      其实计算机运算,减法都可以转换成加法运算,神奇的加法器。

      -32768 - 1 = (-32768)+(-1)   -1的补码为1111 1111 1111 1111

       1000 0000 0000 0000 + 1111 1111 1111 1111 = 0111 1111 1111 1111

       0111 1111 1111 1111的十进制表示32767。

6、-32768 - 1  = 32767, 充满了哲学的味道,否极泰来,天堂与地狱近在咫尺。

7、同样的,32767 + 1 = -32768。

8、于是对于一个类型,比如32位的signed int,它的最小值,就是

      1000 0000 0000 0000 0000 0000 0000 0000,用16进制表示为0x80000000,移位最简单(1<<31)

      它的最大值为0111 1111 1111 1111 1111 1111 1111 1111,用16进制为0x7FFFFFFF。



       


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值