20取反是-21 ?为什么?

LovenDreams 2005-03-19 03:31:55
如题
...全文
897 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
long_xing 2005-03-19
  • 打赏
  • 举报
回复
没有什么好说的,能到这里来的应该不是计算机基础没有学好,而是不爱动脑筋。
我们通常用的计算机中的数据是以补码的形式存储的,这一点大家都懂。
而补码的规则是,正数编码和原码相同,负数的编码是原码取反加1这一点大家肯定也都懂,可为什么不自己计算一下就问啊~!
要学会独立思考问题啊~!!
style1984 2005-03-19
  • 打赏
  • 举报
回复
是的
正数的原码=反码=补码
而负数的原码最高为1
负数的反码为原码除符号位外各位求反
负数的补码是反玛加1
shine51151 2005-03-19
  • 打赏
  • 举报
回复
其实还有个口诀可以帮你快速地由负数的补码看出负数的原码:
“两头不变中间变”
如:

20原码 0000 0000 0001 0100
取反  1111 1111 1110 1011 (这是某个负数的补码表示,要求它的原码)

两头不变指 1111 1111 1110 1011 的首位1和末位1不变,中间变指首位之间的各位按位取反
这样得到  1000 0000 0001 0101 首位为符号,所以这个原码值为 -21.

shine51151 2005-03-19
  • 打赏
  • 举报
回复
楼上的已经讲得挺详细了,我只给楼主你补充介绍一下:

正数的数值是以补码表示的:
 补码和原码相同;
 负数的补码:将该数的绝对值的二进制形式按位取反再加1。
例如:
求-10的补码:
10的原码:
0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
取反:
1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1
再加1,得-10的补码:
1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0
由此可知,左面的第一位是表示符号的。

这样你就会明白了为什么“负值绝对值为原码要减1再取反”,只是逆向考虑一下而已。
gcyds2001 2005-03-19
  • 打赏
  • 举报
回复
正数的反码还是原码或补码嘛。程序员教程上说的。楼主说的是相反数吧?
makoa 2005-03-19
  • 打赏
  • 举报
回复
20原码 0000 0000 0001 0100
取反 1111 1111 1110 1011
最高位为1所以为负值
负值绝对值为原码要减1再取反
减1为 1111 1111 1110 1010
取反 0000 0000 0001 0101===21
所以结果是-21
changxinchen 2005-03-19
  • 打赏
  • 举报
回复
20用原码0000 0000 0001 0100
反码1111 1111 1110 1000
yuchengliu 2005-03-19
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

int main()
{
int na = 20;
cout << -na << endl;
system("pause");
return 0;
}


结果:
-20
请按任意键继续. . .

你是不是用了什么函数???
晨星 2005-03-19
  • 打赏
  • 举报
回复
研究一下补码就明白了。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧