2012-01-19 209 views
4

CoreData提供整數16,整數32和整數64存儲,但不支持任何符號限定符。您可以將一個無符號整型(32位)存儲爲一個有符號長整型(64位),並確保整個範圍內的值保留,但無符號長整型似乎需要一個128位有符號整數來存儲,當然這不是' t由CoreData支持。有什麼方法可以在coreData中存儲unsigned long?有沒有辦法在覈心數據中存儲unsigned long?

回答

3

[上一頁評論晉升回答]

聽起來就像是位模式這是對你很重要,而不是整數值本身。你可以將它作爲一個簽名來存儲 - 只需將它轉換爲C簽署的< - >無符號強制轉換不會強制數學正確性並只保留這些位。重新使用它。

後續問題:

通常是在(Obj-)C(++),則可以無符號整數值存儲到與等效符號整型變量,並且反之亦然。 C使用2的補碼整數從符號 - >無符號定義等價於一個位複製,並且這兩個類型的大小相同。換句話說,unsigned - > signed,是「實現定義」 - 在實踐中通常是意味着一個位拷貝。鏘& 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至少會將其編譯爲直接分配(位拷貝)。)

0

你總是可以將[de]序列化爲一個字符串。它並不是特別乾淨,但只要您可以將其解析爲無符號長整型,它就可以存儲它。

+0

不要轉換爲字符串。這非常昂貴。 –

+0

就像我說過的那樣,它不是乾淨的,但它會_work_,即使有可能_many_更好的方法。一般來說,字符串是一個功能「最低公分母」,許多人忘記了它們是UNIX進程間通信的全部基礎。 – cdeszaq

+0

然後人們開始抱怨CoreData速度很慢。 –

0

unsigned long不是128位(還)。
(或者你有沒有128位CPU?)

在Mac上,根據您的CPU架構,它可能是32位或64位。

見有:

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

所以基本上一個unsigned long將是兼容的意志Integer32Integer64

+0

在這裏稍微誤解了這個問題,OP沒有說unsigned long是128位,但是你看起來需要一個128位有符號值來存儲所有可表示爲無符號long的值 - 從技術上講,你只需要一個65位有符號但是由於某些原因,他們不常見;-)。 'NSNumber'將一個無符號長整型存儲爲有符號的128位值(因爲它在內部將所有整數存儲爲有符號)。 – CRD

2

如果你真的需要 64位無符號的全精度,你可以把它變形(查看文檔有關存儲非標準持久屬性)。 CoreData讓你存儲任何方式的東西。但是你可能不需要完整的64位精度......?!?

+0

我試圖存儲一個文件編號,它是作爲一個無符號長整型給出的,我不確定os是如何保證inode編號的範圍。 – Tony

+3

@Tony - 聽起來像是對你很重要的位模式,而不是整數值本身。你可以將它作爲一個簽名來存儲 - 只需將它轉換爲C簽名<->無符號強制轉換不會強制數學正確性並只保留位。重新使用它。 – CRD

+0

我明白了,這非常有幫助。如果它不是評論,我會將其標記爲正確答案。現在,這是否意味着一般情況下,如果你有一個無符號值,你仍然可以將它存儲在一個有符號值中,即使它溢出了,只要你保證稍後將它返回。 – Tony

相關問題