平方值时的结果错误

时间:2012-12-01 11:21:30

标签: objective-c ios xcode math

要使按钮平方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 个答案:

答案 0 :(得分:4)

int是带符号的32位数字。

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

尝试使用long,这是64位,应该足以满足该数字:

long mainLabelValue = [mainLabelString longLongValue];

答案 1 :(得分:4)

int可能是32位数,518400平方可以用32位表示。其中一些问题在When to use NSInteger vs. int解释。

你可以写

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

NSInteger在iOS中似乎是64位。

答案 2 :(得分:3)

您可能溢出了最大整数大小,因此是负开关。对于32位系统,此值为2,147,483,647(2 ^ 31 - 1)

答案 3 :(得分: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的位差。