android - iOS 和 Android 开发的 C 编译器差异
<p><p>我们刚刚在我们的应用程序的 Android 版本中偶然发现了一个错误,该错误是由 iOS 和 Android 上的编译器差异引起的。好奇是否有人可以解释差异以及如何使 AndroidnativeC 编译器像 iOS 一样工作。这是问题的简化版本。</p>
<pre><code>double zone = -7 / 24.0;
char command = { '\0' };
</code></pre>
<p>//其他东西</p>
<pre><code>command = zone * 24.0;
</code></pre>
<p>忽略上述可能的舍入误差。这是一个简化的例子。</p>
<p>在 iOS 上,command 获取输入的值 -7。这是我所期望的,因为在执行分配时应该自动从 double 转换为 char(或 int)。</p>
<p>在 Android 上,使用原生 C 编译器,我们将 0 放入命令 。如果我们像这样显式地转换它</p>
<pre><code>command = (int)(zone * 24.0);
</code></pre>
<p>然后得到和iOS一样的结果。</p>
<p>有谁知道为什么这两个编译器会生成不同的代码?如果 Android 上有一个编译器标志可以使编译器的行为与 iOS 中的一样?该应用已经在 iOS 上进行了广泛的测试,我们对这个问题有点怀疑。</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>在您的 Android C 实现中,<code>char</code> 是无符号的,从 <code>double</code> 中的 -7 到 <code>char</code> 的转换产生零。 (当值不能以目标类型表示时,此转换的行为未由 C 标准定义。)</p>
<p>在 iOS 中,<code>char</code> 是有符号的,<code>double</code> 中的 -7 到 <code>char</code> 的转换产生 -7。</p>
<p>编译器可能有一个 <code>-fsigned-char</code> 开关可以使 <code>char</code> 签名,或者您可以更改 <code>char command…</code>到 <code>signed char command…</code>.</p>
<p>这就解释了为什么 <code>command = (int)(zone * 24.0);</code> 会得到想要的结果:</p>
<ul>
<li>在将结果分配给 <code>command</code> 之前将结果转换为 <code>int</code> 时,<code>double</code> 中的 -7 将转换为 -7在 <code>int</code> 中。然后这个 <code>int</code> 被转换成一个无符号 <code>char</code>。该转换由 C 标准定义,结果为 CHAR_MAX+1-7(在典型的 C 实现中使用无符号 <code>char</code> 为 249)。这在 iOS (-7) 和 Android (249) 上的结果不同,但它们用相同的位表示。据推测,无论您进一步使用它们,它们的行为都是相同的。</li>
</ul></p>
<p style="font-size: 20px;">关于android - iOS 和 Android 开发的 C 编译器差异,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/21467195/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/21467195/
</a>
</p>
页:
[1]