在同一台机器上输出不同的二进制操作

时间:2013-07-06 13:48:32

标签: javascript ios objective-c c binary

在Safari中执行此JavaScript代码

// expected output - array containing 32 bit words
b = "a";
    var a = Array((b.length+3) >> 2);
for (var i = 0; i < b.length; i++) a[i>>2] |= (b.charCodeAt(i) << (24-(i & 3)*8));

和iOS模拟器中的这个(Objective-)C代码

    int array[((@"a".length + 3) >> 2)];

for (int i = 0; i < @"a".length; i++) {
    int c = (int) [@"a" characterAtIndex:i];
    array[i>>2] |= (c << (24-((i & 3)*8)));

}

给我不同的输出 - 连续(JavaScript)1627389952和(Objective-C)1627748484。

由于前四位数始终相同,我认为错误与精度有关但我无法发现问题。

修改

对不起这种缺乏关注并非常感谢(@Joni和你们所有人)。你是对的,C代码中的数组充满了一些随机值。我解决了将数组中的所有元素设置为零的问题:

memset(array, 0, sizeof(array));

如果有人好奇,C代码现在看起来像这样:

int array[((@"a".length + 3) >> 2)];

memset(array, 0, sizeof(array));

for (int i = 0; i < @"a".length; i++) {
    int c = (int) [@"a" characterAtIndex:i];
    array[i>>2] |= (c << (24-((i & 3)*8)));

}

2 个答案:

答案 0 :(得分:2)

我不知道Objective-c如何在javascript中初始化数组 它们没有被初始化为任何东西(事实上,指数甚至不存在),所以至少要注意:

var b = "a";
var a = Array((b.length + 3) >> 2);
for( var i = 0, len = a.length; i < len; ++i ) {
    a[i] = 0; //initialize a values to 0
}
for (var i = 0; i < b.length; i++) {
    a[i >> 2] |= (b.charCodeAt(i) << (24 - (i & 3) * 8));
}

其次,这应该有效地计算97 << 24,其正确 答案是1627389952,因此Objective-C结果是错误的。可能是因为 数组值未初始化为0?

答案 1 :(得分:1)

您没有在目标c中将数组设置为零,因此可能会有一些随机垃圾开始。