6

32 ビット整数の最大値は 2^31-1 = 2147483647 ですが、負数と正数だけです。数の半分がマイナスだからです。したがって、実際の最大値は 2^32-1 = 4294967295 です。ただし、この場合は正の数のみを使用します。

わかりました、通常の int は負と正の両方の数値です。最大値を 4294967295 にしたいので、正の数だけを使用したいです。「int」の代わりに「unsigned 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 が表示されます。

どうしたの?textFields から数値を取得するときに unsigned intValue を使用する必要がありますか?

ジョナサン


ここで、この数について読むことができます。: http://en.wikipedia.org/wiki/2147483647

4

2 に答える 2

9

問題は、 (ではなく)intValueを返し、2,147,483,647で最大になることです。より大きいが必要な場合は、の代わりに変数とメソッドを使用してください。intunsigned intINT32_MAXlongNSStringlongLongValueintValue

はい、%d署名されていますが、それを使用%uしても、の問題は解決されませんintValuelong 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 に答える