我使用~
操作进行位操作,我只是想知道Java是如何计算负数的?
我查看了Java文档:
“一元位补运算符"~”反转位模式;它可以应用于任何积分类型,使每一个"0“a "1”和"1“a "0”。例如,一个字节包含8位;将该运算符应用于位模式为"00000000“的值将其模式更改为”11111111“。
所以如果是int a = 60 (0011 1100)
,那么int c = ~a (1100 0011)
。
问题是,Java如何计算负数,从而使1100 0011 = -61
?计算1100 0011
的唯一方法是-61
-2^6 + 2^1 + 2^0 = -61
。但这对我来说毫无意义。
发布于 2013-07-05 12:19:59
认为最高位是一个简单符号位的假设是错误。Java以及大多数现代编程语言(和硬件体系结构)都使用所谓的二补表示数字。(巧合的是,位本身确实指示了符号,但并不是以您预期的方式表示的,也就是说,150和-150在表示符号时有更大的差异。)
这种表示一开始似乎是一种奇怪的选择,但它实际上使诸如向负数中添加一个正数(或该数字的变化)这样的操作自动工作,而不必让处理器检查特殊情况。
根据维基百科相关文章
该系统简化了算法在计算机硬件上的实现。在1111 (−1)中添加0011 (3),最初似乎给出了10010的错误答案。然而,硬件可以简单地忽略最左边的位,从而给出正确的0010 (2)答案。溢出检查仍然存在,才能捕获诸如求和0100和0100之类的操作。因此,该系统允许在没有减法电路和检测数字符号的电路的情况下添加负操作数。此外,该加法电路还可以通过取两个数字的补码(见下文)来执行减法,这只需要一个额外的循环或它自己的加法器电路。为了做到这一点,电路只是假装一个额外的左1位存在。
发布于 2013-07-05 12:27:29
https://stackoverflow.com/questions/17496294
复制相似问题