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 的结果是正确的,518400,但如果我尝试平方该数字,而不是 268738560000,我得到 -1844379648。
为什么会这样?

4

4 回答 4

4

Anint是有符号的 32 位数字。

518400 平方的结果不适合 32 位,所以计算溢出,这就是为什么你会看到大的负值。

尝试使用long64 位的 64 位,对于该数字应该足够了:

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

可能是一个 32 位的int数字,而 518400 的平方超过了 32 位所能表示的范围。其中一些在何时使用 NSInteger 与 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 回答