Работаете с большими числами в Objective-C? - PullRequest
2 голосов
/ 10 февраля 2012

Мне нужно преобразовать такие значения, как 1393443048683555715 в HEX.Но, во-первых, я не могу отобразить его как десятичное с помощью NSLog (), например.

Хорошо, это работает:

NSLog(@"%qu", 1393443048683555706);

Но как насчет преобразования в HEX.Какой тип я должен использовать для хранения этого большого значения?

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

, но я забыл сказать, что это большое число представлено в виде строки @ "1393443048683555706" (не int)

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Вы можете использовать спецификаторы формата %qi и %qu с NSLog для отображения 64-битных целых чисел.Похоже, что ваша константа вписывается в 64-разрядное число со знаком и имеет пределы:

[−9223372036854775808 to 9223372036854775807]
1 голос
/ 10 февраля 2012

Спецификатор формата "x" предназначен для 32-битных чисел;вам нужно использовать либо «qx», либо «qX» (в зависимости от того, хотите ли вы, чтобы значения букв были в верхнем регистре или нет).Это средства форматирования для длинных значений без знака, см .:

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]];

Опять же, лучше всего позаботиться об обработке ошибок.

...