Какое наибольшее значение может хранить NSNumber?

Какое наибольшее значение может хранить NSNumber?

// ok
    NSNumber *value = @(1 << 31); 

// gives compiler error, so max NSNumber is 32-bit uint?
    NSNumber *value = @(1 << 32); 

1 ответ

Решение

NSNumber на самом деле является кластером классов, что означает, что при создании экземпляра вы можете получить любой из множества конкретных подклассов, каждый из которых способен хранить различные типы числовых типов. Фактические доступные типы и их размеры могут зависеть от машины.

Изучив документацию по NSNumber, вы увидите различные типы чисел, которые вы можете хранить: две самые большие целочисленные опции: +numberWithLongLong: (или же +numberWithUnsignedLongLong:), которая хранит long long, а также +numberWithInteger: (или же +numberWithUnsignedInteger:), в котором хранится NSInteger. Поэтому максимальные значения NSNumber ограничены этими типами.

Документация Фонда гласит:

При создании 32-разрядных приложений NSInteger представляет собой 32-разрядное целое число. 64-разрядное приложение рассматривает NSInteger как 64-разрядное целое число.

Компилятор умный и создаст NSNumber того же типа, что и ваш числовой литерал. Как уже упоминалось в комментариях выше, вы можете использовать @(1ULL << 32) если ваша машина имеет unsigned long long тип с более чем 32 битами.

Кроме того, NSNumber является бесплатным для моста CFNumber, что означает, что вы можете попробовать такие функции, как CFNumberGetByteSize() и взгляните на раздел " Типы номеров" в документации CFNumber. Вы увидите, что они в основном такие же, как параметры NSNumber.

Кроме того, класс NSDecimalNumber, подкласс NSNumber, обеспечивает +maximumDecimalNumber метод, который вы можете использовать, чтобы найти максимальное значение, которое может быть сохранено в NSDecimalNumber. NSDecimalNumber и типы с плавающей запятой могут хранить больше чисел, чем целочисленные, хотя и с уменьшением точности.

Другие вопросы по тегам