在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)));
}
答案 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中将数组设置为零,因此可能会有一些随机垃圾开始。