我遇到了一个奇怪的问题。我有一个动态创建的二维数组 Content,它的高度为 _h,宽度为 _w(在我的实现中,行是第一个参数,列是第二个参数,在上下文中是有意义的)。两个索引可以越界,这是设计使然,如果是这样,那么索引将“环绕”数组:
Content[v.iget()%_h][u.iget()%_w];
v 和 u 是我自己的类的对象;它们内部有一个 __int64 值并且 iget() 是这样的:
return value>>precision;
它返回一个普通的 32 位整数。我用 % 按高度或宽度“包装”这个 int 值,显然余数总是 0 <= r < max。所以这个 % 操作也提供了一种保护,防止任何可能的越界情况,但我有时会在这条线上遇到访问冲突。当我查看 v 和 u 的值时,它们类似于 -7753978124 - 实际上,在我的上下文中不应该出现负数(所以我还没有寻找导致它的原因),但无论如何,. iget() 应该把它变成一个正常的整数,%_h 或 %_w 应该把它放在边界内,但我却遇到了访问冲突。这怎么可能?
最佳答案
should turn it into a normal integer
没有。
(-1 % 2) == -1
so 表达式 x % max
将返回 (-max..max) 范围内的值。
这是第一个问题。
第二个问题是这样的:
__int64 a = 0xffffffff00000000;
int b = a >> 32;
printf("%d\n", b);
0xffffffff00000000 >> 32
是0xffffffff
,这是一个负数 -1
(对于带符号的 32 位整数,即)。
您可以使用如下表达式解决问题:
((x % width) + width)%width
或者你可以用 if/else 修复索引:
x %= width;
if (x < 0)
x += width;
或者你可以让 iget() 返回 unsigned int
,但是对于所有不是 2 的幂的宽度和高度,这不会正确环绕负索引。
关于c++ - 即使检查了两个索引的边界,动态二维数组也存在奇怪的访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10843631/