Передаешь длинный длинный аргумент в Objective-C? - PullRequest
3 голосов
/ 07 июля 2011

Я пытаюсь передать тип long long в качестве аргумента функции и не удается. Я могу присвоить 5000000000 длинной длинной переменной следующим образом:

long long value = 5000000000;

Но когда я пытаюсь передать эту переменную в метод:

- (void)viewDidLoad
{
    [super viewDidLoad];

    long long value = 5000000000;

    [self test:value];
}

-(void) test:(long long)value
{
    printf("%d\n", value);
}

Значение печатается как 705032704, а не 5000000000. Я подтвердил это в отладчике. Значение 705032704 является постоянным, поэтому кажется, что происходит какое-то усечение.

Я собираюсь начать вырывать мои волосы с этим. Кто-нибудь может помочь?

Спасибо, Alan

Ответы [ 3 ]

12 голосов
/ 07 июля 2011

Ваш printf пытается напечатать его как int со знаком вместо long long.

Используйте %lld для long long

4 голосов
/ 07 июля 2011

Попробуйте:

printf("%lld\n", value);

Проблема с вашим кодом состоит в том, что %d предполагает, что выводимый аргумент будет целым числом.Поэтому printf будет рассматривать только несколько байтов вашего числа, а не все число, и то, что он видит там, эквивалентно 705032704 в двоичном формате.

Вы можете проверить это самостоятельно: 5000000000 в двоичном виде выглядит следующим образом(границы байтов помечены |):

1|00101010|00000101|11110010|00000000

В Objective C целые числа хранятся в 4 байтах, поэтому Objective C просматривает последние 4 байта, что в точности равно 705032704. (Примечаниечто 705032704 = 5000000000 - 2 32 , что составляет последний бит в крайнем левом байте, который был потерян).

0 голосов
/ 07 июля 2011

Я был в подобной ситуации. Вместо этого используйте NSNumber:

-(void) test:(NSNumber*)value
{
    NSLog(@"%@",value);
}   

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self test:[NSNumber numberWithLongLong:5000000000]];
}
...