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

C语言中求负数的补码的过程有如下几个版本,备注:版本①是我自己个人认为的,不一定对。版本①,负整数的补码在最高位“强制”写上1,最高位之后剩下为原码的绝对值部分取反后加1... 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 的补码 是多少呢?
问四,如何通过程序或软件来查看一个数字字计算机中的补码?
展开
 我来答
GTA小鸡
高粉答主

2015-05-22 · 醉心答题,欢迎关注
知道大有可为答主
回答量:2.6万
采纳率:78%
帮助的人:1.3亿
展开全部
谭浩强说的方法适用于数字位数小于字长的情况,也就是符号位不能被覆盖。像-127,只有在规定字长大于8位(含符号位)的情况下,才能适用。两种方法都可以。谭浩强写的很多东西都喜欢把简单的东西复杂化,让新手反而不理解了。最直观的理解方法就是方法1,负数符号位就是1,符号位不变,把去掉符号位后的绝对值部分取反,然后加1,就是负数的补码。
追问
版本①是我自己个人认为的,不一定对啊。。您是否有验证过 版本①是否对过呢?您是怎么验证的?
问三,对于 —0 的补码 是多少呢?
问四,如何通过程序或软件来查看一个数字字计算机中的补码?
追答
你说的第一种方法恰好就是计算负数补码的一般方法。
补码中只有一个0,±0都一样,表示为全零。
虽然整型在内存中是以补码形式存储和参与计算,但读出时,全部表示为正常的原码形式。你可以自己编程将原码重新转换为补码。
做而论道
高能答主

2022-07-28 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部

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

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

如果限定【仅用 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)

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

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

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

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

这就是使用补码的意义。

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

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

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式