Есть ли способ хранить без знака долго в основных данных? - PullRequest
5 голосов
/ 19 января 2012

CoreData предоставляет хранилище Integer 16, Integer 32 и Integer 64, но не поддерживает никаких квалификаторов знаков.Вы можете сохранить беззнаковое целое (32-разрядное) как длинное со знаком (64-разрядное) и убедиться, что значение сохраняется для полного диапазона, но для длинного без знака, похоже, требуется 128-разрядное целое число со знаком для хранения, что, конечно,Поддерживается CoreData.Есть ли способ хранить без знака долго в coreData?

Ответы [ 4 ]

4 голосов
/ 20 января 2012

[Предыдущий комментарий повышен до ответа]

Звучит так, как будто важна битовая комбинация, а не целочисленное значение как таковое. Вы можете сохранить это как подписанное - просто приведите его как C подписанное <-> приведение без знака не обеспечивает математическую корректность и просто сохраняет биты. Примените его обратно, чтобы использовать.

Контрольный вопрос:

В общем, да, в (Obj-) C (++) вы можете хранить целочисленное значение без знака в переменной с эквивалентным целочисленным типом со знаком и наоборот. Преобразование C в значение sign -> unsigned по определению приравнивается к битовой копии при использовании целых чисел дополнения 2, и оба типа имеют одинаковый размер. Иначе говоря, unsigned -> signature - это «определение реализации», которое на практике обычно означает битовую копию. Clang и GCC используют битовую копию для обоих, но если вы хотите быть абсолютно уверены, вы можете использовать union:

unsigned long r;
long l;

r = (unsigned long)l; // will always work (cast optional)

// following is l = (long)r (cast optional) without "implementation defined" risk
{ union { long sValue; unsigned long uValue; } tmp; tmp.uValue = r; l = tmp.sValue;}

А если серьезно, я сомневаюсь, что кто-нибудь будет! (Примечание: Clang по крайней мере скомпилирует его в прямое назначение (бит-копия).)

2 голосов
/ 19 января 2012

Если вам действительно нужна полная точность 64-битного без знака, вы можете сделать его преобразуемым (см. Документацию о хранении нестандартных постоянных атрибутов ) , CoreData позволяет вам хранить практически все таким образом. Но вам, вероятно, не нужна полная 64-битная точность ...?!?

0 голосов
/ 19 января 2012

An unsigned long не 128 бит (пока).
(или у вас процессор 128 бит?)

На Mac, в зависимости от архитектуры вашего процессора, он может быть 32 или 64 бита.

См .:

NSLog( @"%u", sizeof( unsigned long ) );

Таким образом, в принципе unsigned long будет совместимым Integer32 или Integer64.

0 голосов
/ 19 января 2012

Вы всегда можете преобразовать [де] сериализовать его как строку. Он не особо чистый, но дает вам возможность хранить его до тех пор, пока вы не сможете разобрать его обратно в неподписанное длинное.

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