首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Java是如何计算负数的?

Java是如何计算负数的?
EN

Stack Overflow用户
提问于 2013-07-05 12:17:48
回答 2查看 2.6K关注 0票数 12

我使用~操作进行位操作,我只是想知道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

  1. 最高位是符号位。
  2. -2^6 + 2^1 + 2^0 = -61

但这对我来说毫无意义。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-05 12:19:59

认为最高位是一个简单符号位的假设是错误。Java以及大多数现代编程语言(和硬件体系结构)都使用所谓的二补表示数字。(巧合的是,位本身确实指示了符号,但并不是以您预期的方式表示的,也就是说,150和-150在表示符号时有更大的差异。)

这种表示一开始似乎是一种奇怪的选择,但它实际上使诸如向负数中添加一个正数(或该数字的变化)这样的操作自动工作,而不必让处理器检查特殊情况。

根据维基百科相关文章

该系统简化了算法在计算机硬件上的实现。在1111 (−1)中添加0011 (3),最初似乎给出了10010的错误答案。然而,硬件可以简单地忽略最左边的位,从而给出正确的0010 (2)答案。溢出检查仍然存在,才能捕获诸如求和0100和0100之类的操作。因此,该系统允许在没有减法电路和检测数字符号的电路的情况下添加负操作数。此外,该加法电路还可以通过取两个数字的补码(见下文)来执行减法,这只需要一个额外的循环或它自己的加法器电路。为了做到这一点,电路只是假装一个额外的左1位存在。

请参阅这个相关的答案,以获得更深入的解释和许多好的,容易理解的例子。

票数 12
EN

Stack Overflow用户

发布于 2013-07-05 12:27:29

Java的本原数字数据类型 - intlongbyteshort二补表示.这意味着:

  • 除MSB外,最高值是设置为1的所有位的结果。
    • 示例:0111 1111 = 127

  • MSB被设置为1,而所有其他位被设置为0是最低值。
    • 示例:1000 0000 = -128

这里唯一的负值是MSB,所以如果我们将它分解为这个表示,我们将达到-61:

代码语言:javascript
运行
AI代码解释
复制
|-128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|  1  |  1 | 0  |  0 | 0 | 0 | 1 | 1 |

-128 + 64 + 2 + 1 = -61.
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17496294

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文