首页 > 编程知识 正文

两个补码相加怎么算,负数的原码补码反码

时间:2023-05-03 20:13:23 阅读:119350 作者:2598

在计算机中,正数和负数是怎么区分的呢? 怎么保管正数和负数? 在这里,我们使用补数这个概念。 让我们得出结论吧。 正数和负数实际上是用补数存储的。 而且,计算机中是没有减法运算的,减法实际上是补码直接相加

正数和负数的补码是计算机在存储数据之前对数据进行的转换操作,与补码相关的一些名词有原码、反码:

1、原代码:字节的最高有效位为符号位,其馀表示数值大小,最简单; 2、反符号:正数反符号与原符号相同,负数反符号除最高位符号位外,其他位均取反; 3、补码)反码加1,便于计算机计算,**最高有效符号位可以参与计算。 **; 以正数的补码就是原码本身,负数的补码是其反码加1语言为例。

# short占用2字节的存储器,最高有效位为编码位short a=8; 短整型b=-8; 原码补码a 0000000000100000000000000000000 b 10000000001000111111000得到了a、b的补码。 如果模拟计算机计算8-8的值,其实就是直接把a b的补数相加。

0000000000010001111111000=100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

因为short总共只有2个字节,所以舍弃结果的前1位,最终得到0000 0000 0000 0000,即0

因为整数反转介绍了正数和负数的存储方法,所以我们将讨论整数反转的问题。 以c语言的有符号数为例。

int a=0x80000000; int类型共计4个字节,因此内存中的a变量应该如下所示。

10000000000000000000000000000000000这一系列二进制数如果按照数学规则转换为十进制数应该是2147483648,但根据前面的定义,应该是有符号数的最高字节应该是符号位因此,上面的二进制串实际上是一个负数的补码形式,所以直接输出a的十进制数可以得到这其实就是整数反转这样的负数。 (int的可取范围为- 2147483648~2147483647、2147483648

将以上的二进制串手动作为补数,试着进行逆变换。 补数- 1取反码,得到原始码。

首先计算负数的反码,即补数-1,即补数加上-1后的补数。

100000000000000000000000001111111111111111111111111111111----------------------------------------------------. ------------------------------------------.----------------------------------------------

我们发现这里充满了符号位这是因为补码计算中符号位是可以参加计算的,我们始终以结果的最高位作为符号位。 但是,在c语言环境中,如果直接使用0x80000000 - 1,则实际上会丢弃溢出的符号位。 这是因为将结果存储在int类型的4字节变量中。 也就是说,得到0111111111111111

然后,将反转代码转换为原始代码。 最高位为符号位,采用符号位以外的反转。

1011111111111111111111111111111111111111111111111111100000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

也就是说,如果直接输出a,则得到-2147483648。

printf('%d ',a ); 输出结果:-2147483648综合起来,整数反转为什么会发生

在c语言中,如果定义了int a,并给它分配了超过2147483647的正数,则当a存储这个数字时,符号位会发生变化——计算机只保留二进制数的最后32位,舍弃前面的所有内容,并剪切出二进制数

int a=2147483647 1; printf('%d ',a ); 输出结果:通过使用-2147483648负补码正确存储大十进制正数,了解了如何将正数、负数存储在计算机内存中以及整数反转。 那么,如何在不改变数据类型的情况下将十进制大正数正确存储在内存中?

此场景实际上存在于进程之间的数据交换中。 例如,我用python脚本向用c语言开发的接口发送了一个大的正数。 而且,这个数字超过了int能够表示的最大正数,但实际上二进制长度没有超过int的内存大小。

其实,其实如果不需要在意数据格式输出的正负和数字的多少,只关心二进制数据是否正确的话只要保证二进制数据相同就可以了。 例如,假设您想要将正数2147483649存储在int类型变量中:

将2147483648的数学方法转换为二进制,即10000000000000000000000000000000000000000000001。 如果转换为int变量的内存中放一样的二进制数据,则实现了2147483649的存储。 但是,将此变量格式化并输出是有问题的,但二进制数据是一致的~

如果您知道100000000000000000000000000000000000000000001将转换为int型十进制数字,并且对应的数字为-2147483647,因此想要将2147483649存储在int中,请使用33http://www 也就是说,将十进制大正数的数学意义的二进制数据视为负数的补数,转换为对应的负数并赋值。 例如,如果将2147483649的二进制作为负数的补码,则相应的负数为-2147483647,从而获得转换表达式的伪代码。

intnew=old-232(old是大正数) ) ) ) ) ) )。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。