关于二进制补码范围的疑问

sako.c 2019-10-18 03:36:14
我上网查了以下内容: N位二进制补码所能表示的十进制数的范围是-2^(N-1)~+2^(N-1)-1 N位二进制原码和反码所能表示的十进制数的范围是-2^(N-1)-1~+2^(N-1)-1 我们现在来做个测试,用4位二进制来表示-2和-6,并用补码的形式来求和。 -2的补码为1110,-6的补码为1010,按理说,4位二进制的补码的表示范围为-8~7,可是1110与1010相加后的结果是11000,把进位丢弃,则为1000,数值位为000,结果并不是-8,但若是+2(0010)和+5(0101)相加,结果为0111是正确的,同样是边界,为何结果不同? 我询问了老师,他给出的回答是:我们一般不考虑边界问题,(即绕过,避免),计算机一般会把这个1000直接当成-8。 然后我综合了别人的意见,觉得用-2^(N-1)-1~+2^(N-1)-1,来理解补码的表示范围可能是会更好懂的。 欢迎各位提出自己的见解。
...全文
261 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sako.c 2019-10-18
  • 打赏
  • 举报
回复
呃呃。。。。。。。。。
铖邑 2019-10-18
  • 打赏
  • 举报
回复
这个老师,哎…………
weixin_40290083 2019-10-18
  • 打赏
  • 举报
回复
引用 5 楼 sako.c的回复:
[quote=引用 3 楼 早打大打打核战争的回复:]正数的补码和原码相同,负数的补码是原码取反+1,根本原因在于原码反码的编码中0有正0和负0两种形式,多占了一个编码空间,而补码的编码中每个值有唯一的编码,就可以用原码的负0表示-2^(N-1)
所以这个负零就代表-8是吗?[/quote] 1000就是-8呀,8的原码1000,取反0111,再加1结果为1000,最高为为1,仍为1000。 1000为负数,数据位为000,取返111,再加1为1000,十进制为8,由于是负数,所以为-8
weixin_40290083 2019-10-18
  • 打赏
  • 举报
回复
引用 5 楼 sako.c的回复:
[quote=引用 3 楼 早打大打打核战争的回复:]正数的补码和原码相同,负数的补码是原码取反+1,根本原因在于原码反码的编码中0有正0和负0两种形式,多占了一个编码空间,而补码的编码中每个值有唯一的编码,就可以用原码的负0表示-2^(N-1)
所以这个负零就代表-8是吗?[/quote] 补码就没有负0,补码时所有数值范围内的都有唯一编码
liups 2019-10-18
  • 打赏
  • 举报
回复
引用 5 楼 sako.c 的回复:
[quote=引用 3 楼 早打大打打核战争的回复:]正数的补码和原码相同,负数的补码是原码取反+1,根本原因在于原码反码的编码中0有正0和负0两种形式,多占了一个编码空间,而补码的编码中每个值有唯一的编码,就可以用原码的负0表示-2^(N-1)
所以这个负零就代表-8是吗?[/quote] 补码中没有-0
sako.c 2019-10-18
  • 打赏
  • 举报
回复
引用 6 楼 早打大打打核战争的回复:
[quote=引用 5 楼 sako.c 的回复:]
[quote=引用 3 楼 早打大打打核战争的回复:]正数的补码和原码相同,负数的补码是原码取反+1,根本原因在于原码反码的编码中0有正0和负0两种形式,多占了一个编码空间,而补码的编码中每个值有唯一的编码,就可以用原码的负0表示-2^(N-1)

所以这个负零就代表-8是吗?[/quote]

如果是4位数那就是-8,8位数就是-128...
[/quote] 哦哦,好的,懂了。。。。
  • 打赏
  • 举报
回复
引用 5 楼 sako.c 的回复:
[quote=引用 3 楼 早打大打打核战争的回复:]正数的补码和原码相同,负数的补码是原码取反+1,根本原因在于原码反码的编码中0有正0和负0两种形式,多占了一个编码空间,而补码的编码中每个值有唯一的编码,就可以用原码的负0表示-2^(N-1)

所以这个负零就代表-8是吗?[/quote]

如果是4位数那就是-8,8位数就是-128...
sako.c 2019-10-18
  • 打赏
  • 举报
回复
引用 3 楼 早打大打打核战争的回复:
正数的补码和原码相同,负数的补码是原码取反+1,根本原因在于原码反码的编码中0有正0和负0两种形式,多占了一个编码空间,而补码的编码中每个值有唯一的编码,就可以用原码的负0表示-2^(N-1)
所以这个负零就代表-8是吗?
liups 2019-10-18
  • 打赏
  • 举报
回复
引用 2 楼 liups 的回复:
1000怎么就不是-8了?明明就是-8嘛
4位补码范围是-8到+7,其中-8的二进制表示为1000,-1为1111,0为0000,1为0001,7为0111
  • 打赏
  • 举报
回复
正数的补码和原码相同,负数的补码是原码取反+1,根本原因在于原码反码的编码中0有正0和负0两种形式,多占了一个编码空间,而补码的编码中每个值有唯一的编码,就可以用原码的负0表示-2^(N-1)
liups 2019-10-18
  • 打赏
  • 举报
回复
1000怎么就不是-8了?明明就是-8嘛
wowpH 2019-10-18
  • 打赏
  • 举报
回复
这里是有点绕,时不时就忘了,1000表示-8 但是还是不知道为什么。。。

70,037

社区成员

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

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