1

long long でモジュロ演算子 (%) を使用しようとしていますが、数値が unsigned int の範囲を超えている場合は 0 を返すようです。代わりに使用する必要がある演算子または関数はありますか、それとも自分でロールする必要がありますか?

-- 更新: 以前はサンプル コードがなくて申し訳ありませんでした。私は急いでドアを出ました --

コードは次のとおりです。

long long val = 12345678991245; // always less than LLONG_MAX
int power = 0;
NSMutableArray *powers = [[NSMutableArray alloc] init];
while (pow(10, power) <= val) {
    tVal = (val % (lround(pow(10, power + 1)))) / lround(pow(10, power));
    [powers addObject:[NSNumber numberWithInt:tVal]];
    NSLog(@"Power: %d tVal: %d", power, tVal);
    val -= val % lround(pow(10, power + 1));
    power++;
}

NSLogただし、そのステートメントによって作成された出力を見るとUINT_MAX、数値が 1,111,111,111,111を超えると次のようになります。

2009-03-18 20:42:16.471 Numbers[11197:20b] Power: 0 tVal: 1
2009-03-18 20:42:16.472 Numbers[11197:20b] Power: 1 tVal: 1
2009-03-18 20:42:16.473 Numbers[11197:20b] Power: 2 tVal: 1
2009-03-18 20:42:16.476 Numbers[11197:20b] Power: 3 tVal: 1
2009-03-18 20:42:16.476 Numbers[11197:20b] Power: 4 tVal: 1
2009-03-18 20:42:16.477 Numbers[11197:20b] Power: 5 tVal: 1
2009-03-18 20:42:16.477 Numbers[11197:20b] Power: 6 tVal: 1
2009-03-18 20:42:16.477 Numbers[11197:20b] Power: 7 tVal: 1
2009-03-18 20:42:16.477 Numbers[11197:20b] Power: 8 tVal: 1
2009-03-18 20:42:16.478 Numbers[11197:20b] Power: 9 tVal: 0
2009-03-18 20:42:16.478 Numbers[11197:20b] Power: 10 tVal: 0
2009-03-18 20:42:16.479 Numbers[11197:20b] Power: 11 tVal: 0
2009-03-18 20:42:16.479 Numbers[11197:20b] Power: 12 tVal: 0

過去に到達するまではすべてコーシャUINT_MAXであり、その後は 0 を返します。

Xcode 3.1.2 を使用して iPhone SDK に対してコンパイルしています。

何か案は?

4

1 に答える 1

4

lround32 ビットの long を返します。llround代わりに試してください。

いっそのこと、整数演算を行うために浮動小数点を使用しないでください。ループのたびに指数を 1 ずつ増やしているため、毎回べき乗を計算する必要はありません。それを変数に格納し、反復ごとに 10 を掛けるだけです。

また、数を 10 の累乗で割る代わりに、毎回 10 で割ってみてください。

バグを探している場合は、コードを小さなステップに分割し、中間操作の結果を確認してください。

于 2009-03-18T15:31:02.213 に答える