C语言学习笔记之补基础(有符号和无符号数)

关于(-128,127)的问题,以前也看过相关内容,但是一直没有完全的理解,现在再回过头学习后又有了深入的理解,写此文章仅为加深记忆。

正数和负数在计算机中的存储都是以二进制位的形式,但是对于正数来说直接存储即可,而负数则是以补码的形式存储的,负数在计算机中的存储最高位表示符号位(1:负数,0:正数),例:

7:(这里以 2 字节为例子说明)

原码:0000 0111

-7:

原码:1000 0111

反码:1111 1000(符号位不变其余位按位取反)

补码:1111 1001(反码+1)

那么为什么要使用补码呢?

1:解决了 0 的编码问题;

2:可以多保存一个最小值(针对负数),如 -128(只有补码1000 0000,没有原码和反码)

3:可以简化电路设计,不必专门再设计一个减法电路,只需要一个加法器和一个求补电路即可;

先来看一下计算机中 0 的编码:

+0:

原码:0000 0000

-0:

原码:1000 0000

反码:1111 1111

补码:如果符号位不参与运算,那么结果为1000 0000,此时 0 在计算机中就有了两种编码,显然不行,如果符号位参与了运算,那么结果为0000 0000,此时 0 在计算机中的编码就唯一了,而1000 0000也就可以用来多保存一个最小值即-128;

再看计算机中的加减法运算:

3 + 7:

    0000 0011-->3

+  0000 0111-->7

=  0000 1010-->10

3 - 7:(可以看作 3 + ( -7 ))

    0000 0011-->3

+  1111 1001-->补码 -7

=  1111 1100-->为补码

    1000 0011-->反码

    1000 0100-->原码 -4

7 - 3:(可以看作 7 + ( -3 ))

    0000 0111-->7

+  1111 1101-->补码 -3

=10000 0100-->4(此时符号位也参与了计算,最高位产生的进位被舍弃)

为什么补码要设计成:补码 = 反码 + 1 ?

原因可能如下:

首先想 -7 在计算机中该怎样存储呢,我们知道 7 在计算机中的存储编码为 0000 0111,那么只需要找一个与 7 相加结果为 0 的编码即可,这个编码为:

1111 1001

但这样又存在唯一性的问题,由于

1111 1111 + 1 = 0000 0000;

于是就有了先让 7 (0000 0111)加上一个数等于 1111 1111 的值,这个值为 1111 1000,此值再加上 1 之后便为 1111 1001,以此作为 -7 的编码,所以得出了结论。

参考资料来自王利涛老师课程。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值