为什么整数,双精度数等的最小值比正数更远离零1?


10

我知道它与2的补码加1有关,但是当涉及到负数时,我真的不知道如何用相同的位数对一个数字进行编码。


3
真正令人讨厌的部分是Abs(MinValue)为负。
OldFart 2013年

1
在Java中,Double.MIN_VALUE是最小的正值,并且距零最远的(实数)数具有相等的幅度(因为它具有适当的符号位)
棘轮怪胎

Answers:


16

用这些术语考虑一下。以2位数字加上前面的符号:

000 = 0
001 = 1
010 = 2
011 = 3

现在让我们来谈谈负面因素:

111 = -1
110 = -2
101 = -3

等等,我们还有

100 ... 

它必须为负,因为符号位为1。因此,从逻辑上讲,它必须为-4。

(编辑:正如WorldEngineer正确指出的那样,并非所有的编号系统都以这种方式工作-但您所要求的编号系统却可以。)


11

因为在整数范围内没有两类数字,而是三类:负数,零和正数。零必须占用一个槽(不能代表零...是不切实际的……),因此,正类或负类必须放弃一个槽。通常,必须做出牺牲的通常是正范围,这一事实在一定程度上是任意的,但是在位操作的层面上,某些事情使此决定变得更加方便。


不只是一点操作。一组32位带符号的数字是一组数字,其二进制表示形式在第31位之后的所有位中都具有相同的值,并且一个这样的数字具有无限的一组1,后跟31个零。该数字的加法逆数,即无限的零字符串,后跟单个1和31零,不适合有符号值所需的模式。
2014年

4

基本上有三种表示二进制有符号整数的方式:2的补码,1的补码和符号幅度。(很久以前,Biquinary沿用了“渡渡鸟”的风格。)

1的补码和符号幅度有两个零值+0和-0,每个都有唯一的表示形式。2的补码只有一个零值和一个表示。

现在,一个N位的字段可以编码2 ^ N个值。减去2的补数,您将得到2 ^ N-1 = 2 ^(N-1)+ 2 ^(N-1)+1。由于零的表示形式都是零位,而+符号是零,符号位设为1的情况下,还会有另一种可能的非零表示形式。

这是说2的补数表示-(2 ^(N-1)).. +(2 ^(N-1)-1)范围内的值的一种冗长的方法。

如果要进行整数数字信号处理计算,则1的补码实际上比2的补码具有优势。1的补数运算本质上会截断为零。2的补码截断为-infinity。我以一种艰难的方式学到了这一点...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.