2010-01-06 2 views
1

Я столкнулся с странным явлением, когда передаю длинное длинное значение из вызова метода. В моем приложении я уже работал над этим, но мне любопытно узнать, почему это так.Неожиданные результаты при долговременном возврате вызова метода

Может кто-нибудь объяснить мне, когда у меня есть метод, как определено:

- (long long)testLong { 
    NSString* longString = @"100000133597162"; 
    long long retval = [longString longLongValue]; 
    NSLog(@"retval:%lld",retval); 
    return retval; 
} 

и я называю метод следующим образом:

long long test = [self testLong]; 
NSLog(@"test:%lld",test); 

Результаты:

retval:100000133597162 
test:410044394 

Мне кажется таким странным. Правильное значение распечатывается внутри метода. Но один раз за пределами метода он кажется совершенно другим значением. Я перешел через отладчик, и он показывает одно и то же - два разных значения. Я просто не могу объяснить это. Кто угодно?

+0

указатель на стек –

+0

Странно, ваш код работает нормально для меня. – Vladimir

+0

У вас есть одна и та же подпись в файле заголовка? –

ответ

4

Это не «совершенно другое значение»; 410044394 - это низкие 32 бита 100000133597162. Вы почти наверняка просто пренебрегли включением файла заголовка или указали способ как возвращающий long или int.

Если ваша вызывающая функция не может определить, какой правильный тип возврата, она предположит, что это тип id, который имеет 32 бита на iPhone, что приведет к точному усечению, которое вы видите здесь ,

Аналогично, если ваша функция вызова имеет прототип, который объявляет тип возврата размером в 32 бита на iPhone (например, long или int), вы увидите тот же эффект усечения.

+0

Вы правы. Я пренебрег тем, что оставил прототип вне заголовка. Как только я застрял там, все выглядит хорошо. Спасибо – WillF

+0

Рад это услышать. –

Смежные вопросы