c语言中-128补码,对与-128的补码理解

http://blog.chinaunix.net/uid-16249993-id-2750042.html

今天看到一个问-128的补码为何就是 1000 0000的贴子.

问是如何计算出来?是不是还是按:取相应正数的原码,最高位即符号位,取1,其余各位取反后

整个得值 +1?

按我的理解(上学时学c语言就是这样理解的,老谭那本书上讲整数的取值范围那段就有)

16位int  -32768至32767 -2^(16-1)至 +2^(16-1)-1

:8位二进制的原值表达范围为:-127至127

共有256个组合序列 0000 0000 至1111 1111 。

+128的原值在8位中是表达不出来的。

我个人的理解是:

(1)、

应当从数学层面上去理解:

从数学上计算 256-128=128,

因为:256-128=256+(-128)的补码

而    256-128=128

所以   256+(-128)的补码=128

所以   (-128)的补码=256-128

=128

而从数学上, 128=1000 0000

故规定-128的补码为 1000 0000

所以说,128在8位内存中是表达不出来的。

不存在+128 8位原码及反码的形式,按常规算法是不对的。

注意:只是规定而已,下面还有原因。

(2)、

8位二进制 的补码组合序列有

0000 0000 - 0111 1111 0  -  +127

1000 0000                   用来干啥好呢?(表示-0,不是的,-0的原码是1000 0000 补码是

0000 0000  +0 的补码也是 0000 0000

)

1000 0001-  1111 1111 -1 - -127

全部状态为256个

再看看这个规律表

原码        补码   值

0111 1111   0111 1111 127

0111 1110   0111 1110 126

......补码不断-1........

0000 0000   0000 0000  0

1000 0001   1111 1111 -1

1000 0010   1111 1110 -2

1000 0011   1111 1101 -3

......补码不断-1........

1111 1111   1000 0001 -127

无法表达     1000 0000 -128

于是就有了规定 1000 0000 定为 -128的补码

这种定法和上面数学层面的表述是一致的。

这样规定后,负数的补码在机器中就好算了。

在约定的范围内(-128-+127,对16位32位64位等扩大范围)

先将该负数取绝对值,再用二进制表示出这个绝对值 (不管符号位)

对该二进制数进行取反加一操作就得到负数的补码了

-128 绝对值是 128

128的二进制表示为:

1000 0000

取反

0111 1111

加1

1000 0000

这就是-128的补码

这种办法算出的结果符合“规定值”,规定而已。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值