【问题标题】:what's wrong this this code, Numeric overflow warning这段代码有什么问题,数字溢出警告
【发布时间】:2017-09-06 06:44:27
【问题描述】:
fillColor = (fillColor & (0xFF << 24)) | (colorRGB & 0xFFFFFF);

以上是我的代码,我觉得应该没问题。但是 Android Studio 给我一个警告说:

表达式中的数值溢出 less... (Ctrl+F1)

此检查检查在计算期间溢出的表达式,即:      a = 1.0/0.0;

我找不到代码有什么问题,请帮忙。

【问题讨论】:

  • fillColor是什么类型?
  • fillColor 和 colorRGB 都是 int。

标签: java android colors


【解决方案1】:

0xFF &lt;&lt; 24 等于 0xFF000000,“技术上”不适合作为有符号值的 int(例如,将

此“hack”将值设置为 long,然后将其转换为 int。相同的位最终出现在值中,但强制转换明确告诉编译器您很乐意以这种方式截断值。

(int)((long)0xFF << 24);

因此,为了特别修复您的代码,我将 0xFF &lt;&lt; 24 扩展为 long(注意尾随 L),然后将其转换为 int。

fillColor = (fillColor & (int)0xFF000000L) | (colorRGB & 0xFFFFFF);

另见Why is Java able to store 0xff000000 as an int?

【讨论】:

  • 谢谢,看了你的回答,我知道为什么android studio给我警告了。但是我只是做一些位操作,所以我认为没有必要对高位(符号位)做特殊的事情。 IDE 给了我一个警告,但这段代码可以正常工作,对吗?
  • 对于颜色操作,重要的是位。我解释过的演员保留了这些位。它只是说服编译器一切正常。例如 0xFFFFFFFF 实际上是 -1 作为有符号值,而 0xFFFFFFFF 作为无符号值。但这仍然是 1 的 32 位。它只是一种解决方法,因为 Java 没有无符号值。
猜你喜欢
  • 2017-10-07
  • 2022-06-10
  • 1970-01-01
  • 2015-04-25
  • 2018-09-09
相关资源
最近更新 更多