Как мне умножить большие числа вместе в Objective-C? - PullRequest
4 голосов
/ 16 июля 2011

в Objective-C:

unsigned long t1 = 1310789847 * 1000;

вызывает переполнение и показывает неверный результат.

как мне получить 1310789847000?

Ответы [ 2 ]

5 голосов
/ 16 июля 2011

Используйте NSDecimal.В каркасе Foundation есть все виды удобных функций для манипулирования NSDecimal структурами, которые в основном представляют собой супер большие числа (не только целые числа).Вы получаете базовые операции сложения, вычитания, умножения, деления, возведения в степень и т. Д., Но обычно они достаточно мощные, чтобы сделать совсем немного вещей .

5 голосов
/ 16 июля 2011

Результат не помещается в 32-битную длину без знака, поэтому вы получаете переполнение, и результат имеет только «нижние» 32 бита.Вместо этого вы можете использовать unsigned long long, который является 64-битным (на Intel Mac, не уверен насчет других платформ).

unsigned long long t1 = (unsigned long long)1310789847 * 1000;

64-битные целочисленные литералы обозначаются буквой L, поэтому вы также можете сделать:

unsigned long long t1 = 1310789847L * 1000;

Поскольку вы имеете дело с литералами, вышеприведенное верно.Я только что узнал, что для переменных нет необходимости приводить (Xcode 4):

unsigned long a = 1310789847;
unsigned long b = 1000;
unsigned long long t1 = (unsigned long long)a * b; 
unsigned long long t2 = a * (unsigned long long)b;
unsigned long long t3 = a * b;
unsigned long long t4 = 1310789847 * 1000;
NSLog(@"%lld %lld %lld %lld\n", t1, t2, t3, t4);

Вывод:

2011-07-16 08:33:40.445 LongLongTest[16738:903] 1310789847000 1310789847000 1310789847000 824821720

FWIW, я удивлен, что компилятор замечает, чтооперанды должны быть расширены до 64 бит перед умножением, но не могут сделать то же самое для литералов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...