简单的赋值会产生错误的值

Simple assignment coming up with wrong value

本文关键字:错误 赋值 简单      更新时间:2023-10-16
private static void convert(int x) {
    // assume we've passed in x=640.
    final int y = (x + 64 + 127) & (~127);
    // as expected, y = 768
    final int c = y;
    // c is now 320?!
}

对于为什么上面的代码会产生上面的值,是否有任何合理的解释?此方法从 JNI 调用。传入的x最初是static_cast jint的C++ int类型,如下所示:static_cast<jint>(x);

调试器中,在 y 赋值上设置断点,我看到 x=640。走一行,我看到y=768。再走一条线,c=320。使用调试器,我可以设置变量 c = y,它会正确分配给它 768。

此代码是单线程的,每秒运行多次,并且始终观察到相同的结果。

从下面的评论更新

经过

一天的调试,这个问题现在已经完全消失了。我会把它归咎于宇宙射线,如果它没有一整天可重复地发生。我很久没见过的最奇怪的事情了。

我将暂时搁置这个问题,以防有人对可能导致这种情况的原因有一些见解。

步骤01:正确编译,请参阅帖子下的评论。

如果需要,我用这段代码它会去:C# 代码:

private void callConvert(object sender, EventArgs e)
        {
            string myString = Convert.ToString(convert123(640));
            textBox1.Text = myString;
        }
    private static int convert123(int x) {
    // assume we've passed in x=640.
    int y = (x + 64 + 127) & (~127);
    // as expected, y = 768
    int c = y;
    // c is now 320?!
    return (c);
}

但它是一个 C# 代码

和给你的提示 永远不要用编译器中用作标准的名称来调用你的功能。 转换是使用最多的语言。

(system.convert)

你最近有没有把c设置为320?如果是这样,它可能已经存储在某个内存中,编译器可能已将其重新分配给它认为它是什么,而不是它应该是什么。不过,我部分是在猜测。

如果程序针对内存使用进行了优化,则看起来像临时变量的内存字节大小问题。调试器可能不可靠。我看到临时 ~127 是否存储在一个字节中,那么您可能会达到您观察到的情况。这完全取决于运行时存储的~127是什么。