0

この JavaScript コードを Safari で実行する

// 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。

最初の 4 桁は常に同じなので、エラーは精度に関係していると思いますが、問題を特定できません。

編集

この不注意で申し訳ありませんが、どうもありがとうございました (@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)));

}
4

2 に答える 2

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 に初期化されていないためでしょうか?

于 2013-07-06T14:00:23.463 に答える
1

目的 c で配列をゼロに設定していないため、最初はランダムなガベージが含まれている可能性があります。

于 2013-07-06T14:02:05.203 に答える