C语言中负数的补码的问题

C语言中求负数的补码的过程有如下几个版本,备注:版本①是我自己个人认为的,不一定对。
版本①, 负整数的补码 在最高位“强制”写上1,最高位之后剩下为 原码的绝对值部分取反后加1
版本②,像谭浩强《C程序设计》(第三版)P41中所说的
例如求 -10 的补码的方法是:
一, 取-10的绝对值10
二,10的绝对值的二进制形式为 1010
三,对1010取反得 111111111111 0101 (一个整数占16位)
四,再加1得 -10的补码 111111111111 0110

问一,究竟是哪个对呢?为什么呢?能举个反例吗?谢谢。
问二,对于-127 若对于8位来说 它的补码 我用网络上的计算器得到的是 10000001
那若按版本②,即谭浩强《C程序设计》(第三版)P41中所说的 方法
那得到的是 结果是 0000001 啊
1111111 (127的绝对值)
0000000 (取反)
0000001 (加1)
即使按书中 (一个整数占16位)来看那 -65535 的补码 岂不是 0000000000000001 了吗?
毕竟 65535 对应的二进制是 1111111111111111
问三,对于 —0 的补码 是多少呢?
问四,如何通过程序或软件来查看一个数字字计算机中的补码?

谭浩强说的方法适用于数字位数小于字长的情况,也就是符号位不能被覆盖。像-127,只有在规定字长大于8位(含符号位)的情况下,才能适用。两种方法都可以。谭浩强写的很多东西都喜欢把简单的东西复杂化,让新手反而不理解了。最直观的理解方法就是方法1,负数符号位就是1,符号位不变,把去掉符号位后的绝对值部分取反,然后加1,就是负数的补码。追问

版本①是我自己个人认为的,不一定对啊。。您是否有验证过 版本①是否对过呢?您是怎么验证的?
问三,对于 —0 的补码 是多少呢?
问四,如何通过程序或软件来查看一个数字字计算机中的补码?

追答

你说的第一种方法恰好就是计算负数补码的一般方法。
补码中只有一个0,±0都一样,表示为全零。
虽然整型在内存中是以补码形式存储和参与计算,但读出时,全部表示为正常的原码形式。你可以自己编程将原码重新转换为补码。

温馨提示:内容为网友见解,仅供参考
第1个回答  2022-07-28

补码,其实是一个“代替负数做运算”的正数。

用十进制来说明,比较容易理解。

如果限定【仅用 2 位 10 进制数】,就可以有:

  24 - 1 = 23

  24 + 99 = (一百) 23

舍弃进位,保留 2 位数,+99 就和-1 是等效的。

+99,就可以代替-1 做运算。

此时,+99,就称为-1 的补数。

同理,+98,是-2 的补数。

   。。。

求补数的公式:

  补数 = 负数 + 10^n, n 是位数。

-----------------------

计算机使用 2 进制,补数,就改称为:补码。

求补码的公式:

  补码 = 负数 + 2^n, n 是位数。

对于-1,求其 16 位补码的算法就是:

  [-1]补码 =-1 + 2^16


        =-1 + 65536

        = 65535

        = 1...(共 16 个 1)

-----------------------

用补码代替负数,计算机中,就没有负数了。

因此,在计算机中,也就没有减法运算了。

那么,硬件,就可以简化了。

这就是使用补码的意义。

如果从“原码反码符号位取反加一”来求补码,

你就不会理解“使用补码的意义”。

本回答被网友采纳
相似回答