要使按钮平方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。
为什么会这样?
答案 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的位差。