简单的赋值会产生错误的值
Simple assignment coming up with wrong value
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是什么。
相关文章:
- 错误:在为指针赋值时,void值没有被忽略
- 使用 mat.at<uchar>(i,j) 的 opencv C++中的矩阵赋值错误
- 奇怪的 G++ 错误,带有关于左值和赋值的简单代码
- 重载赋值运算符函数和复制构造函数中的错误
- 当我尝试构建此程序时,出现此错误:需要左键作为赋值的左操作数
- 错误:无法在赋值中将"双 ()(双)抛出 ()"转换为"双倍"
- 错误消息:使用复制构造函数和重载赋值运算符
- 为什么在取消引用的指向接口的指针上使用赋值运算符不是编译器错误
- 如何重载 const 对象的 [],以便值赋值不会导致编译错误
- C++的新增功能:创建 2D 数组并具有正确的赋值运算符:分割错误
- C++:构造函数中的向量赋值错误
- 使用赋值运算符复制两个类中的数组时出现编译器错误
- 可以错误地使用赋值运算符而不是比较运算符的地方,= Vs ==
- 唯一指针中的赋值运算符错误
- 不断增加的指针数组 错误:赋值中的类型不兼容
- C++赋值构造函数瓦尔格林德错误
- { } 构造函数实现中的赋值运算符 => 错误
- 使用宏进行赋值和错误检查
- 两个向量赋值错误
- 错误:在 GEANY 中将"int"赋值为"char [1]"时类型不兼容