2010-09-19 35 views
8

所以基本上我的問題是,我創建一個NSMutableDictionary使用uint64_t對象作爲關鍵。轉換(u)int64_t到NSNumbers

有沒有比這樣做更好的方法來創建它們?

uint64_t bob=7; 

NSNumber *bobsNumber; 

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
bobsNumber=[NSNumber numberWithUnsignedLong:bob]; 
#else 
bobsNumber=[NSNumber numberWithUnsignedLongLong:bob]; 
#endif 

只要你沒有將它包含在二進制文件/套接字/ NSData對象/無論什麼,這將工作。但是有沒有更好的方法來做到這一點?我真的很想確定該對象是64位的,不管我在哪個平臺上運行它。

我想我可能只是避免整個問題的總是無符號的很長很長,但當然是廢物噸的64臺機器,如果我在任何顯著數量分配這些對象的堆空間....

回答

16

long long在64位OS X/iOS平臺上是64位。在所有OpenStep下降的平臺上,numberWithUnsignedLongLong:對於uint64_t是正確的。

我最後一次檢查,您使用的工廠方法實際上並不影響還是使用的表示;它只取決於數字的值(除非您使用太小的尺寸,導致它被截斷)。

更新:這些天來,正確的答案是NSNumber *bobsNumber = @(bob);

+0

它沒關係的原因是編譯器知道使用類型的實際位寬。如果它們不匹配,則將其中一個轉換爲另一個 - 或者通過削波位或通過擴展前導0來實現。 – 2010-09-19 17:01:09

+0

你是誤解。我的意思在第二段是'[NSNumber的numberWithLongLong:73]'將產生相同的對象'[NSNumber的numberWithChar:73]',而不是一個由'長long'和其他對象產生對象返回由'char'支持。現在我很煩重新檢查,10.6.4中並不是這種情況。 (你可以用'CFShow()'來檢查它,它會告訴你內部表示。) – 2010-09-19 20:04:34

相關問題