回答
如果你设置一个二进制补码整数的所有位,那么你得到-1。
让我说明了(非常小的),二位有符号整数使用补:
00 → 0
01 → 1
10 → −2
11 → −1
这仅仅是从0开始计数了,过去的溢出从1到-2并且结束-1 。正如你所看到的,如果你清除所有的位,你得到0,如果你设置它们全部,你得到-1(不管整数有多宽)。
(请注意,使用基本的人都知道这已经,因为没有布尔运算符和工作的事情同样出色位运算符,除了真正的是-1,而不是1)
即零实际上是由32个零比特表示,如PHP整数类型是32位有符号整数,而不是单位:
0000 0000 0000 0000 0000 0000 0000 0000
所以按位非翻转其中所有,导致-1的two's complement(与最左边的一个代表符号):
1111 1111 1111 1111 1111 1111 1111 1111
如果你不明白为什么所有的位都是-1,那就问问自己:如果你给它加1,你会得到什么?答案:溢出并且所有位都为零。当你添加一个数字时,我们有一个给出零的数字的名称... -1。 – 2012-01-09 07:22:40
David,这对于二进制补码是正确的,但对于符号位或补码(至少不是天真的)不适用。从没有亲密认识电脑的人的角度来看,任何一种选择都可以同样解释。 – Joey 2012-01-09 07:25:45
是它应该与2的补数系统,与设置的所有位的数量等于-1,自0拥有所有位取消设置,〜$ A将其所有的位设置。
因此,代码的行为如预期。
整数以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 ;
- 1. 与其他语言互操作?
- 2. 这是可能的java或任何其他编程语言
- 3. 操纵在MATLAB或任何其他语言的数学函数
- 4. 不能要求语言学或其他LIB,从文件
- 5. 将语言功能集成到其他语言中
- 6. 在ubuntu上用php或其他语言编辑文件
- 7. atoi()其他语言
- 8. 使用Rails或其他语言
- 9. 还有其他什么像WCF,其他平台,操作系统,语言?
- 10. 标题在其他语言不翻译
- 11. C++或任何其他语言的可选结构打字可能性?
- 12. IIS6中缺少标题(ColdFusion,也可能是其他语言)
- 13. C#(或任何其他语言)的复杂装修新语言功能
- 14. php优于其他脚本语言
- 15. json_decode PHP错误?同样的Json工作在其他语言
- 16. 其他.NET语言的重载操作符
- 17. C#类与其他.NET语言互操作
- 18. libumem是否仅在Solaris操作系统或其他操作系统中可用?
- 19. 如何操作位汇编语言MIPS32
- 20. php - proc_open(或其他功能)
- 21. .equal不能在其他语句中工作如果语句为
- 22. 其他语言还可以通过指针操作来创建数组?
- 23. 使用PHP或其他编程语言验证电子邮件?
- 24. 调整大部分图像(php或任何其他语言)
- 25. ajax和php(或其他服务器语言),哪个更好?
- 26. 使用PHP或任何其他语言获取引用链接
- 27. 脚本语言是否可以翻译成其他语言?
- 28. 只显示php而不是netbeans 6.9中的其他语言?
- 29. 在其他语言中recaptcha词
- 30. Django模板语言:在其他语言中使用for循环
它确实代表只值。在两个赞美中,所有1的位字段是-1。 http://en.wikipedia.org/wiki/Two%27s_complement – GordonM 2012-01-09 07:29:21