Неожиданные результаты при возврате long long при вызове метода - PullRequest
1 голос
/ 06 января 2010

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

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

- (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

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

1 Ответ

4 голосов
/ 06 января 2010

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

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

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

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