4

上下文:我们有业务要求以 3 或 4 位字符串报告值。如果字符串是 3 位数字,它的值实际上是 *10。

例如 123 代表 1230,而 4567 代表 4567。

从存储的整数转换回字符串时,上述代码被视为确定这一点的一种方法。我们的问题是优化器会为 x(整数和浮点数)删除此代码。特别关注 Java,但接下来的问题是其他语言的行为方式

另一个明显的方法是使用 Mod (x%10)。

4

5 回答 5

2

接下来的问题是其他语言会如何表现?

在 C 中使用 gcc 在各种优化级别进行了一些快速测试,并查看了生成的代码。不,它不会被优化掉。即使编译器可以x == (x/10)*10在编译时进行评估(因为 x是一个常量),它仍然会被正确评估。

更新:如果您考虑一下,这是一个明显的结果。编译器不应该(x/10)*10x针对整数“优化” x,因为它仅适用于整数集的 1/10。

于 2012-04-26T00:49:10.357 回答
1

(x/10)*10您的问题做出了必然等于的错误假设x。一般来说,只要满足 Java 语言规范的要求,Java 编译器和虚拟机就可以按照他们想要的任何方式优化任何东西。

If xis a floator a doublethenx == (x/10)*10如果没有浮点舍入误差。但是,10 是 anint并且 ifx是 an intorlong然后表达式使用整数除法。Java 语言规范非常清楚除法运算符对整数的作用。即它向零舍入。因此,Java 编译器可能会将该表达式优化为除除后乘之外的其他内容,但无论优化器做什么,它都必须产生正确的结果。

于 2012-04-26T01:45:19.623 回答
0

上面的代码被视为确定这一点的一种方法

我不知道为什么,因为它没有。如果它还不是零,它所做的就是将最后一位数字更改为零。

不允许编译器和 JVM 对其进行优化,因为这不会给出相同的答案。

于 2012-04-26T01:31:16.903 回答
0

我不确定我是否完全理解这些要求。你当然可以做类似的事情

String s = x < 1000 ? String.valueOf(10*x) : String.valueOf(x);

优化器不可能删除您拥有的代码,因为整数除法不是一个身份,但它似乎是一种非常复杂的方法。

顺便说一句,如果您的值肯定会达到 9999,并且速度很重要,那么可以通过静态初始化程序或惰性创建一个包含 10,000 个字符串的静态数组。

于 2012-04-26T05:28:55.790 回答
-1

正如已经解释的那样,这无法优化,但你为什么不使用

(x%10 == 0) ? x/10 : x

转换回来?

于 2012-04-26T01:12:17.320 回答