当前位置: 首页 > 面试题库 >

Java中的溢出短缺

艾原
2023-03-14
问题内容

我对shortJava中的数据类型有一个疑问。我知道简称范围在-32768至32767之间。

因此,如果我尝试添加两个超出该范围的短值,结果最终将是假定的总值减去正范围或负范围乘以2,如下所示:

short a = 30000;
a = (short) (a+a);

结果是 -5536

所以数学是 32768 + 32768 = 655366000 - 65536 = -5536

我知道它的作用,但我不知道为什么会这样。

谁能解释逻辑或Java为什么这样做呢?


问题答案:

发生的事情是您的电话号码四处徘徊。更具体地说,您有一个数字30,000,二进制形式为:

0111 0101 0011 0000

当您将其添加到自身并携带1时,您将获得:

1110 1010 0110 0000

(注意:将二进制数乘以2很容易-只需将所有位向左移动一位即可。)

short是带二进制补码的带符号数字,表示最左边的1实际上是减号;该数字表示-5536。

如果将该数字再次乘以2,则需要两个以上的字节来表示它。由于a中的字节数不超过2个short,因此当int表达式的结果缩小为a
时,多余的位将被丢弃short。做到这一点就足够了,您将用0作为最左边的数字。该数字再次为正。最后,您将再次获得1作为最左边的数字;该数字再次为负。最终,您将所有0都移到了数字中。将任何整数乘以2足够的倍数将始终为0(特别是,如果它是N位数字,则将其乘以2
N倍将始终为0)。

如果不缩小到a short,您最终仍然会用完int (需要33位或更多位)中的数字-
这将导致多余的数字被丢弃,这是整数溢出。如果其中一个参数为a
long,则同样的事情也会发生,尽管它需要65+位。



 类似资料:
  • 我在一次采访中被问及这一点。我被要求计算数字x1,x2,x3,…的平均值,。。。xn公司 //所以归结起来是这样的: 面试官说列表的大小是未知的,它可能很大,所以总和可能会溢出。他问我如何解决溢出问题,我的回答是跟踪我们可能超过最大数量的次数等等,他说了一些关于推入堆栈、平均值和长度的事情,我从来没有真正理解他的解决方案,将这两个变量推入某种列表中?有人知道吗?

  • 问题是当我将页面收缩到某个点时, 元素的顶部溢出,奇怪的是底部没有溢出。说清楚一点,我不想让这两个都溢出来。 这里有一个指向它的JSFiddle链接:https://jsfidle.net/maep468x/1 您将看到,当您运行它并将结果窗口缩小到大约350px时, 元素开始溢出。 我已经尝试从.main-content规则中删除我的line-height和font-size属性,但它仍然溢出。

  • 由于溢出,下面代码中的第一个for循环找不到正确的最大值。然而,第二个for循环确实如此。我用了门闩。com查看该程序的字节码,该程序显示,要确定哪个数字更大,第一个for循环使用isub,第二个for循环使用if_icmple。有道理。然而,为什么if_icmple能够成功地进行这种比较,因为它在某些时候也必须进行减法运算(我认为这会产生溢出)? 输出是 最大值为-2147483648

  • 我有一个文件解析器代码,偶尔会在m.matches()上出现堆栈溢出错误(其中m是匹配器)。 我再次运行我的应用程序,它解析相同的文件,没有堆栈溢出。 我的模式确实有点复杂。它基本上是一组可选的零长度正lookahead,其中包含命名组,这样我就可以匹配一组变量名/值对,而不考虑它们的顺序。但我认为,如果某个字符串会导致堆栈溢出错误,它总是会导致它。。。不只是有时候。。。有什么想法吗? 我的模式

  • 本文向大家介绍CSS3中对溢出的处理?相关面试题,主要包含被问及CSS3中对溢出的处理?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: cnkOhu text-overflow属性,值为clip是修剪文本;ellipsis为显示省略符号来表被修剪的文本;string为使用给定的字符串来代表被修剪的文本。    

  • 问题内容: 您可以尝试/捕获Java中的堆栈溢出异常吗?它似乎在向任一方向投掷自己。当程序溢出时,我想“惩罚”该值。 问题答案: 似乎可以工作: