0

ボタンを の値に二乗するためにmainLabel、私は使用しています

- (IBAction)squarePressed:(id)sender
{

    NSString *mainLabelString = mainLabel.text;

    int mainLabelValue = [mainLabelString intValue];

    NSString *calculatedValue = [NSString stringWithFormat: @"%d", mainLabelValue*mainLabelValue];

    mainLabel.text = calculatedValue;

}

エラーは表示されず、小さな数値でもうまく機能します。
たとえば、720 を 2 乗した結果は正しい 518400 ですが、その数値を 2 乗しようとすると、268738560000 ではなく -1844379648 になります。
なぜこうなった?

4

4 に答える 4

4

Anintは符号付き 32 ビット数です。

518400 の 2 乗の結果は 32 ビットに収まらないため、計算がオーバーフローします。そのため、大きな負の値が表示されます。

を使用してみてくださいlong。これは 64 ビットであり、その数には十分なはずです。

long mainLabelValue = [mainLabelString longLongValue];
于 2012-12-01T11:24:43.710 に答える
4

intおそらく 32 ビットの数値であり、518400 の 2 乗は 32 ビットで表現できる量を超えています。その一部は、いつ NSInteger vs. int を使用するかで説明されています。

あなたは書くことができます

NSInteger mainLabelValue = [mainLabelString longValue]; // or long mainLabelValue...
NSString *calculatedValue = [NSString stringWithFormat: @"%ld", mainLabelValue*mainLabelValue];

NSInteger は iOS では 64 ビットのようです。

于 2012-12-01T11:28:00.237 に答える
3

おそらく最大整数サイズをオーバーフローしているため、負のスイッチです。32 ビット システムの場合、この値は 2,147,483,647 (2^31 - 1) です。

于 2012-12-01T11:27:08.833 に答える
1

これは数値オーバーフローです。オーバーフローを回避するために最大のビット数を使用する場合は、long longを使用します。また、long doubleは適切ですが、それほど正確ではありません。

- (IBAction)squarePressed:(id)sender
{

    NSString *mainLabelString = mainLabel.text;

    long long mainLabelValue = [mainLabelString longLongValue];

    NSString *calculatedValue = [NSString stringWithFormat: @"%lld", mainLabelValue*mainLabelValue];

    mainLabel.text = calculatedValue;

}

もちろん、この方法でも大きな数値を使用すると、オーバーフローが発生する可能性がありますが、intからlong long intまでのビット差によっては、より高い値で発生します。

于 2012-12-01T11:33:56.710 に答える