【问题标题】:iOS - int (unsigned int) maximum value is 2147483647, unsigned int doesn't work?iOS - int (unsigned int) 最大值为2147483647,unsigned int 不起作用?
【发布时间】:2012-12-15 04:55:06
【问题描述】:

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

好的,正常的 int 既是负数又是正数。 我只想使用正数,因为我希望最大值为:4294967295。 我要使用 “无符号整数” 代替 “整数”

但这行不通! 最大值仍然是 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

【问题讨论】:

  • 是的,我相信你需要使用无符号整数。一旦你停止使用它,所有的值都会被扔到有符号的 int 最大值。另外,如果您对如何完成某事有想法,何不尝试一下?
  • @JonathanGurebo 顺便说一句,如果你真的关心大于2,147,483,647 的数字,你应该注意rand() 永远不会生成大于RAND_MAX、@987654326 的数字@。您可能应该调整您的随机数算法。尝试在04,294,967,295 之间生成数字,你会发现你永远不会得到大于2,147,483,647 的值。
  • 如果使用iOS 4.3或更高版本,请使用ranNumber = arc4random_uniform(maxNumber-minNumber+1) + minNumber;,解决了rand()RAND_MAX问题,支持到UINT32_MAX
  • 为什么不使用 double 或 float :)

标签: ios integer int unsigned


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    问题是intValue,它返回一个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;
    

    【讨论】:

    • 好的,我将代码更改为:unsigned int minNumber;无符号整数最大值;无符号整数; minNumber=[self.textFieldFrom.text longLongValue]; maxNumber=[self.textFieldTo.text longLongValue]; ranNumber=rand()%(maxNumber-minNumber+1)+minNumber; NSString *str = [NSString stringWithFormat:@"%d", ranNumber]; self.label.text = str;但是当我使用高数字时它会给我负数。
    • @JonathanGurebo 1. 将unsigned int 更改为long long。 2.不要使用%dunsigned int,而是使用%u,如果你使用long long,使用%lld
    • 嗨,我的标签在屏幕的中心,当我使用“%11d”时,它不再是中心了。实际上,xcode 告诉我使用“%11lld”。
    • 我认为你误读了我的评论。我不是建议%11d(带有一个),而是%lld(带有小写的“L”)。只需将其设为%lld(带有小写“L”且没有数字十一)。
    • 谢谢! .!,,,,,,,,,,,,,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 2013-08-20
    • 2016-02-26
    • 2021-08-07
    • 1970-01-01
    • 2021-12-13
    相关资源
    最近更新 更多