6

32 位整数的最大值为:2^31-1 = 2147483647。但只有负数和正数。因为数字的一半是负数。所以真正的最大值是 2^32-1 = 4294967295。但在这种情况下,我们只使用正数。

好的,正常的 int 既是负数又是正数。我只想使用正数,因为我希望最大值为:4294967295。我将使用“unsigned int”而不是“int”

但这行不通!最大值仍然是 2147483647。

这是一个简单的随机数生成器的代码:

-(Action for my button) {

unsigned int minNumber;

unsigned int maxNumber;

unsigned int ranNumber;

minNumber=[self.textFieldFrom.text intValue]; //getting numbers from my textfields
maxNumber=[self.textFieldTo.text intValue]; //Should i use unsigned intValue?

ranNumber=rand()%(maxNumber-minNumber+1)+minNumber;

NSString *str = [NSString stringWithFormat:@"%d", ranNumber];

self.label.text = str;

}

这会将 : 2147483647 视为最大值。

怎么了?当我从我的文本字段中获取数字时,我应该使用 unsigned intValue 吗?

乔纳森


在这里您可以阅读有关此号码的信息。:http ://en.wikipedia.org/wiki/2147483647

4

2 回答 2

9

问题是intValue它返回 a int(不是unsigned int)并在 2,147,483,647 处达到最大值。如果您需要大于INT32_MAX,则使用long变量和NSString方法longLongValue而不是intValue

是的,%d已签名,但如果您使用%u它并不能解决intValue. 使用long long变量和longlongValue方法将解决这个问题。例如:

NSString *string = @"2147483650";

unsigned int i = [string intValue];
NSLog(@"i = %u", i); // returns 2147483647

NSUInteger j = [string integerValue];
NSLog(@"j = %u", j); // returns 2147483647

long long k = [string longLongValue];
NSLog(@"k = %lld", k); // returns 2147483650

因此,查看您的原始代码,可能是:

long long minNumber;

long long maxNumber;

long long ranNumber;

minNumber = [self.textFieldFrom.text longLongValue];
maxNumber = [self.textFieldTo.text longLongValue];

ranNumber = arc4random_uniform(maxNumber-minNumber+1) + minNumber;

NSString *str = [NSString stringWithFormat:@"%lld", ranNumber];

self.label.text = str;
于 2012-12-30T21:36:20.747 回答
5

%d 修饰符被解析为有符号整数。

于 2012-12-30T21:21:27.180 回答