使用Objective-C中的大数字?

时间:2012-02-10 17:09:01

标签: objective-c hex decimal bigdecimal

我需要将1393443048683555715之类的值转换为HEX。但是,首先,我不能使用NSLog()将其显示为十进制,例如。

好的,它有效:

NSLog(@"%qu", 1393443048683555706);

但转换为HEX怎么样?我必须用什么类型来存储这个大价值?

NSLog([NSString stringWithFormat: @"%x", 1393443048683555706]);
// result eb854b7a. It's incorrect result!

但我忘了说这个大数字表示为字符串@“1393443048683555706”(不是int)

2 个答案:

答案 0 :(得分:2)

您可以使用%qi%qu格式说明符和NSLog来显示64位整数。您的常量似乎符合64位有符号数,其限制为:

[−9223372036854775808 to 9223372036854775807]

答案 1 :(得分:1)

" x"格式说明符用于32位数字;你需要使用" qx"或" qX" (取决于您是否希望字母值为大写)。这些是无符号长long值的格式化程序,请参阅:

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html#//apple_ref/doc/uid/TP40004265-SW1

接下来,您不应该像上面那样将字符串直接传递给NSLog - 这可能会导致崩溃。

NSLog(string); // bad!!
NSLog(@"%@", string); // good

因此,如果您的值以字符串形式出现,那么您将要执行此操作:

NSString *longNumber = @"1393443048683555706";
NSLog(@"%qx", [longNumber longLongValue]);

如果字符串值不能强制转换为数字,则longLongValue将返回0.我将留给您处理错误(和边界)检查 - 有关详细信息,请参阅NSString

如果要将十六进制值保存为字符串,请执行以下操作:

NSString *hexRepresentation = [NSString stringWithFormat:@"%qx", [longNumber longLongValue]];

同样,最好注意错误处理。