美文网首页计算机组成原理
关于负数在计算机使用补码显示的一些思考

关于负数在计算机使用补码显示的一些思考

作者: 一剑孤城 | 来源:发表于2023-03-08 12:48 被阅读0次

这里总结关于为什么负数运算使用补码的一些思考。

问题一:补码是什么?

补码是为了方便计算机对负数进行运算而发明出来的,对于正数没有意义。补码其实就是使用进行运算的数字的模(比如:一个8位二进制的模是1 0000 0000即2^8)减去当前负数的绝对值得到的结果。因为一个负数的绝对值加上他的反码是当前位数所能表示的最大值,也就是摸减去一,所以,一个负数的补码公式为:补码=反码+1。

问题二:为什么负数需要换成补码运算?

一个8位的二进制,最高位0代表正数,1代表负数,那么:

1 + 2 = 3
0000 0001 + 0000 0010 = 0000 0011  //3两个正数相加结果正确
-1 + 2 = 1
1000 0001 + 0000 0010 = 1000 0011 //-3一个负数+正数结果错误
-1 + (-2) = -3
1000 0001 + 1000 0010 = 0000 0011 //3两个负数相加结果错误

由于负数的原码直接参与运算得出的结果都是错误的,所以,现在有两个解决办法:

1.在加法器的基础上再实现一个减法器
2.在不增加减法器的基础上通过其他方法实现负数的运算

总的来说,大佬们采取了后面一种办法来曲线救国,这个就是补码。

1 + 2 = 3
0000 0001 + 0000 0010 = 0000 0011  //3两个正数相加结果正确
-1 + 2 = 1
1111 1111 + 0000 0010 = 0000 0001 //原码1一个负数+正数结果正确
-1 + (-2) = -3
1111 1111 + 1111 1110 = 1111 1101 //将该补码取反加一转换成原码为-3两个负数相加结果正确

那么为什么将负数变成补码就可以正确运算呢?这就要用到模的概念了。
举个比较好理解的例子,时钟。一个时钟有12个大的刻度,假如现在是6点,那么把指针拨到3点有两种办法,一种是逆时针拨动3格,也就是6-3=3,或者顺时针波动9格,即6+9=3(15-12=3),这两种方法是等价的。很明显,时钟的模为12,那么从当前刻度转一圈12刻度其实回到了原点,所以,15点其实就是3点,即6-3=6+(12-3)-12=6+9-12,因为12超出显示范围所以被丢弃,即减去一个数等于加上一个数的补数,同理二进制的负数运算也可以转换成加法。

问题三:计算结果正负以及溢出

先看结果:


Screen Shot 2023-03-09 at 11.56.27.png
1.关于相加结果正负

两个正数相加为正数和两个负数相加为负数,这两个应该没有异议。主要是正数+负数,从操作来看,正负符号相加为1,那么如果最高位进位1和符号位1相加,则为0,结果是正的;如果最高位没有进位,则符号位为1,结果是负的。从原理来讲,正数+负数=正数+补码,有进位说明正数+补码>=模, 因为|负数|+补码=模,那么正数>=|负数|,所以结果为正;同理没有进位说明正数+补码<模,那么正数<|负数|,所以结果为负。

2.关于相加结果溢出

两正数相加,最高位有进位就是超模了,所以,溢出。一正一负相加是不会溢出的,因为结果最大和最小值的绝对值也比模小一。两负数相加,最高位没有进位,说明两负数的补码相加没有超模,那么两负数的原码相加就肯定超模了,因为负数和其补码相加结果等于模,那么两负数加两补码就等于两个模,那么,两负数补码相加没有超模,两负数相加肯定超模,所以,两负数相加,最高位没有进位,结果就溢出了。

问题四:一个8位有符号整型最小值是-128

按照规则一个8位有符号整型的表示范围为:-127~127,但是这里有个问题就是0的唯一性问题,这里1000 0000和0000 0000都表示0,那么运算的时候用哪个表示0比较好,这个计算机无法判断,所以,干脆就把1000 0000表示-128,不仅可以表示多一位数,还可以解决0的唯一性问题,很合理。

以上就是我遇到关于负数补码的一些问题的思考,仅供参考。

参考:为什么计算机中的负数要用补码表示?

相关文章

  • int数字的表示

    在计算机中int型数字使用补码的形式在存储。首先说明补码的计算方式。正数和零的补码就是他们本身。负数的补码是符号位...

  • 计算机中二进制补码的运算原理

    在计算机中负数以补码形式表示,计算负数补码的方法是符号位不变,其余位按位取反再加1。简言之,补码是计算机中用来表示...

  • 位运算

    1.原码、反码、 补码正数的原码、反码、 补码都一样 正数以原码存储在计算机负数 以补码存储在计算机 例...

  • 字符串知识点

    ·二进制补码基础 补码用于在计算机内表示负数, 负数 2的补码表示法可以将加法运算规则,扩展到整个整数集。 · 机...

  • 用位运算求一个数的绝对值

    在计算机内,数据都是以二进制形式的补码存储和运算,正数的补码为它的原码,而负数的补码=反码+1,对于负数的反码,是...

  • 6-三码合一&位运算

    1.原/反/补码! 数据在计算机内部是以补码的形式储存的对于正数:反码====补码====原码。对于负数:反码==...

  • 补码

    计算机中用补码来表示负数。以Java语言为例,int类型为32位4字节。 怎么求补码? 正数的补码为其本身;负数的...

  • 负数在内存中的表示方式

    在计算机中数值是以二进制补码形式存在的。 正数的补码不变 负数的补码为 原码 ->取反 -> 加一以 -112...

  • 补码与反码

    计算机中存储数据 都是以 补码的形式存储 正数: 补码 = 原码 负数 : 对应正数的原码 --> 取反 -...

  • 计算机编码相关问题

    整数在计算机中的编码 整数在计算机中是以补码的形式存储的, 补码和原码的区别在负数上。 下面代码上展示了10这个整...

网友评论

    本文标题:关于负数在计算机使用补码显示的一些思考

    本文链接:https://www.haomeiwen.com/subject/yebildtx.html