2015-01-01 2 views
0

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

NSInteger bannerStamp = [[eachDict objectForKey:@"timeStamp"] integerValue]; 
NSLog(@"%@",[eachDict objectForKey:@"timeStamp"]); 
NSLog(@"%d",bannerStamp); 

ВЫВОД

2015-01-01 10:44:52.482 SalesApp[24570:60b] 3597478187 
2015-01-01 10:44:54.094 SalesApp[24570:60b] -697489109 
+0

Является ли строка, в которой вы используете фактически целое число без знака (для которого вы должны получить unsignedIntegerValue)? –

+0

@BradBrighton Да, это всегда будет положительное значение. –

ответ

2

пытаются конвертировать в длинные длинное значение

long long bannerStamp = [[eachDict objectForKey:@"timeStamp"] longLongValue]; 
NSLog(@"%@",[eachDict objectForKey:@"timeStamp"]); 
NSLog(@"%lld",bannerStamp); 

Вот разница между 32-битной и 64-битной архитектуры,

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
typedef long NSInteger; 
typedef unsigned long NSUInteger; 
#else 
typedef int NSInteger; 
typedef unsigned int NSUInteger; 
#endif 

Apple, документ ссылка на changes to data types

+1

Благодарим за ссылку на документ Apple. Я получил эту проблему несколько месяцев назад. Я сделал то же самое, как вы объяснили, спасибо. – ObjC

1

Вот что я получаю за поднятие верхней части моей головы. Проверьте этот код и выведите его для различных подходов.

//******* 
NSLog(@"For SO question"); 
NSDictionary *eachDict = @{ @"timeStamp" : @"3597478187" }; 
NSDecimalNumber *decimalBannerStamp = [NSDecimalNumber decimalNumberWithString:[eachDict objectForKey:@"timeStamp"]]; 
NSInteger bannerStamp = [[eachDict objectForKey:@"timeStamp"] integerValue]; 
uint64_t bannerStampUINT64 = [[eachDict objectForKey:@"timeStamp"] longLongValue]; 
NSLog(@"%@",[eachDict objectForKey:@"timeStamp"]); 
NSLog(@"NSInteger: %u",bannerStamp); 
NSLog(@"uint64_t: %llu",bannerStampUINT64); 
NSLog(@"DecimalObject: %@", decimalBannerStamp); 
NSLog(@"Decimal unsigned value: %lu", (unsigned long)decimalBannerStamp.unsignedIntegerValue); 
NSLog(@"End SO question code"); 
//******* 


2014-12-31 22:14:50.206 PIClient[5112:2296154] For SO question 
2014-12-31 22:14:50.212 PIClient[5112:2296154] 3597478187 
2014-12-31 22:14:50.213 PIClient[5112:2296154] NSInteger: 2147483647 
2014-12-31 22:14:50.213 PIClient[5112:2296154] uint64_t: 3597478187 
2014-12-31 22:14:50.214 PIClient[5112:2296154] DecimalObject: 3597478187 
2014-12-31 22:14:50.215 PIClient[5112:2296154] Decimal unsigned value: 3597478187 
2014-12-31 22:14:50.215 PIClient[5112:2296154] End SO question code 
+0

Вероятно, лучше использовать uint64_t (который беззнаковый длинный), который будет 64-битным значением как для 32-разрядных, так и для 64-разрядных систем. – zaph

+0

Если исходные данные или результирующее использование преобразованного значения требуют дополнительной меры безопасности, я согласен. –

+0

Ни в коем случае. NSUInteger bannerStamp = [[eachDict objectForKey: @ "timeStamp"] unsignedIntegerValue]; показывает тот же результат. –

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

  • Нет связанных вопросов^_^