Результат не помещается в 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 бит перед умножением, но не могут сделать то же самое для литералов.