我正在处理来自JSON源的大型64位无符号整数,这些整数被解析为NSDecimalNumbers,这显然是"忠实地表示任意精度数".
我遇到的问题是我无法从这堂课中得到正确的数字.例如(使用可能的最大值):
print (unsigned long long) [[NSDecimalNumber decimalNumberWithString:@"18446744073709551615"] unsignedLongLongValue]
= 0 // Incorrect
print (unsigned long long) [[NSDecimalNumber decimalNumberWithString:@"9223372036854775808"] unsignedLongLongValue]
= 9223372036854775808 // Correct
print (unsigned long long) [[NSDecimalNumber decimalNumberWithString:@"9223372036854775810"] unsignedLongLongValue]
= 9223372036854775808 // Incorrect
Run Code Online (Sandbox Code Playgroud)
看起来我无法获得大于NSDecimalNumber中最大签名long long值的任何值.它不喜欢大于9223372036854775808的值.但是看起来这个数字是以NSDecimalNumber中的完整精度存储的,如:
po [[NSDecimalNumber decimalNumberWithString:@"18446744073709551615"] stringValue]
= 18446744073709551615
Run Code Online (Sandbox Code Playgroud)
我注意到NSNumber对象可以正常处理这些大数字,unsignedLongLongValue可以正常工作.它只是NSDecimalNumbers(我坚持使用),它不起作用.
如何从NSDecimalNumbers中获取正确的无符号long long值?或者至少将它们转换为unsignedLongLongValue可以工作的NSNumber对象.
我有一个像这样的NSString:
@"200hello"
Run Code Online (Sandbox Code Playgroud)
要么
@"0 something"
Run Code Online (Sandbox Code Playgroud)
我想要做的是获取NSString中的第一个出现的数字并将其转换为int.
所以@"200hello"会变成int = 200.
和@"0 something"将成为int = 0.
我正在开发一款具有Game Center功能的游戏.在内部,我的游戏保留了类型变量的所有分数int64_t,因为这是通过GameKitAPI 报告分数所需的类型(我假设这是为了避免32位和64位平台之间的歧义).
到现在为止还挺好.
接下来,我希望将用户的hiscore存储在本地(例如,in NSUserDefaults.但是.plist是等效的),因为当没有经过身份验证的Game Center播放器时,还要通过iCloud键值与用户拥有的其他设备同步.
我可以像这样存储他的核心int64_t:
// (int64_t) _hiscore is an ivar.
// (NSString) _playerID is the authenticated player ID, or else
// "AnonymousUser" when GKLocalPlayer is not authenticated.
[playerData setObject:@(_hiscore) forKey:@"HiScore"];
[[NSUserDefaults standardUserDefaults] setObject:playerData forKey:_playerID];
[[NSUserDefaults standardUserDefaults] synchronize];
Run Code Online (Sandbox Code Playgroud)
...(假设"@()"运算符将在所有情况下都要小心 - 不确定这个......),但是NSNumber我应该使用哪种方法来检索值而不会冒整数溢出的风险?
所有-*value类的方法(例如-intValue,-longValue,-unsignedIntegerValue等)的返回类型是平台相关的(不像的int64_t,它具有显式字节大小).这篇文章提供了关于每个平台上所有数据类型的精彩信息,但它对NSNumber... 没有帮助
我可以对每个平台的区分类型的大小进行运行时检查(例如,查看是否sizeof(unsigned long)等于4或8,并在每种情况下使用不同的方法),但这看起来并不优雅.并不是说新架构会很快出现,但......
我还可以将号码存储为一个字符串,如在这个岗位,但手头上有字典友好的NSNumber,感觉傻... …
我从MPMediaPickerController获取媒体项的ID.根据文档,此值是包含uint64_t(unsigned long long)的NSNumber对象.我想将其转换为NSString以保存在我的数据模型中.但是,当我将其转换为字符串时,其值会发生变化,当我将其转换回数字时,它会再次更改!显然,我对这些数据类型并不了解.你能帮我吗?
MPMediaItem *mediaPicked;
// set mediaPicked to an MPMedia item using MPMediaPickerController...
NSLog(@"id as number: %qu", [mediaPicked valueForProperty:MPMediaItemPropertyPersistentID]); // outputs 566042331449280
NSLog(@"id as string: %@", [[mediaPicked valueForProperty:MPMediaItemPropertyPersistentID] stringValue]); // outputs 16204893883745507648
NSLog(@"id as number: %qu", [[[mediaPicked valueForProperty:MPMediaItemPropertyPersistentID] stringValue] longLongValue]); // outputs 9223372036854775807
Run Code Online (Sandbox Code Playgroud)
如果我尝试在此转换之前播放媒体项目,它始终有效.但是如果我在转换后尝试播放媒体项目,那么我尝试过的媒体项目中只有大约一半可以使用.因此,一些ID值在转换后仍然存在,而另一些则没有.
我试图从一个字符串创建一个unsigned long long,所以我可以在其他地方使用该值,但没有太多的运气这样做...这是我用来尝试这个
-(void)unsignedLongValue{
NSString *theString = [NSString stringWithFormat:@"%llu", [NSNumber
unsignedLongLongValue]];
theString = [[_message objectForKey:@"user"] objectForKey:@"id"];
NSLog(@"%llu");
}
Run Code Online (Sandbox Code Playgroud)
如果您有任何建议或知道任何好文章,如果您能通知我,我将非常感激!谢谢!
objective-c ×5
cocoa ×2
nsstring ×2
32bit-64bit ×1
cocoa-touch ×1
game-center ×1
icloud ×1
integer ×1
ios ×1
ios4 ×1
iphone ×1
string ×1
types ×1