2012-01-09 28 views

回答

8

如果你设置一个二进制补码整数的所有位,那么你得到-1。

让我说明了(非常小的),二位有符号整数使用补:

00 → 0 
01 → 1 
10 → −2 
11 → −1 

这仅仅是从0开始计数了,过去的溢出从1到-2并且结束-1 。正如你所看到的,如果你清除所有的位,你得到0,如果你设置它们全部,你得到-1(不管整数有多宽)。

(请注意,使用基本的人都知道这已经,因为没有布尔运算符和工作的事情同样出色位运算符,除了真正的是-1,而不是1)

+1

“使用BASIC的人”我正式太年轻,不能记住。 – BoltClock 2012-01-09 07:29:39

+1

至少在Visual Basic 6之前,就是这样,如果我没有记错的话。 VB.NET引入了短路'AndAlso'和'OrElse'以及一个布尔类型。 – Joey 2012-01-09 07:41:11

5

即零实际上是由32个零比特表示,如PHP整数类型是32位有符号整数,而不是单位:

0000 0000 0000 0000 0000 0000 0000 0000 

所以按位非翻转其中所有,导致-1的two's complement(与最左边的一个代表符号):

1111 1111 1111 1111 1111 1111 1111 1111 
+4

如果你不明白为什么所有的位都是-1,那就问问自己:如果你给它加1,你会得到什么?答案:溢出并且所有位都为零。当你添加一个数字时,我们有一个给出零的数字的名称... -1。 – 2012-01-09 07:22:40

+1

David,这对于二进制补码是正确的,但对于符号位或补码(至少不是天真的)不适用。从没有亲密认识电脑的人的角度来看,任何一种选择都可以同样解释。 – Joey 2012-01-09 07:25:45

2

是它应该与2的补数系统,与设置的所有位的数量等于-1,自0拥有所有位取消设置,〜$ A将其所有的位设置。

因此,代码的行为如预期。

0

整数以2的赞美形式存储。

此形式可以是轮廓广告如下:

1)如果要存储的数是正的值,则它的二进制值被存储

例如 $ VAL = 5;

这里$ VAL包含ordiary二进制equivlent 5 = 0101 //比特数取决于具体

2)如果你存储负的数的说-5,然后存储在二进制补码小号

$val = -5; 

这里先2的5恭维被发现即只需1的5 + 1

~ 0101 = 1010 

将TnEN的恭维加1

1010 + 
    1 
    ----- 
    1011 

并且这个1011被存储在$ val中。

以相同的方式,$ val = 0; 00存储

〜$ VAL => 11这是-2 2的恭维形式equalient

最后,如果你仔细观察,你可能会问,

所以我怎么能代表11 ?因为它的二进制值是1011与2的comp中的-5值相冲突?

答案在于用来表示数字的位数。

2的complimwent形式

如果有N位,然后你可以从

-2^(n-1) to 2^(n-1) -1 ; 
相关问题