2010-09-19 25 views
8

Vì vậy, về cơ bản câu hỏi của tôi là điều này, tôi đang tạo một NSMutableDictionary sử dụng các đối tượng uint64_t làm khóa.Chuyển đổi (u) int64_t thành NSNumbers

Có cách nào tốt hơn để tạo chúng hơn làm việc này không?

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 

Điều này sẽ hoạt động miễn là bạn không đưa vào tệp nhị phân/ổ cắm/đối tượng NSData/bất kỳ thứ gì. Nhưng có cách nào tốt hơn để làm điều này? Tôi thực sự muốn chắc chắn rằng đối tượng là 64-bit bất kể nền tảng nào tôi chạy nó.

Tôi đoán tôi chỉ có thể tránh được toàn bộ vấn đề bằng cách luôn luôn đi unsigned dài dài nhưng tất nhiên rằng chất thải tấn của không gian đống trên máy 64 bit nếu tôi bố trí các đối tượng trong bất kỳ số lượng lớn ....

Trả lời

16

long long là 64 bit trên nền tảng OS X/iOS 64 bit. Trên tất cả nền tảng OpenStep-hậu duệ, numberWithUnsignedLongLong: là chính xác cho uint64_t.

Thời gian qua tôi đã kiểm tra, phương pháp nhà máy bạn sử dụng không thực sự ảnh hưởng đến cách trình bày được sử dụng; nó chỉ phụ thuộc vào giá trị của số (trừ khi bạn sử dụng một kích thước quá nhỏ, làm cho nó bị cắt ngắn).

Cập nhật: những ngày này, câu trả lời đúng là NSNumber *bobsNumber = @(bob);.

+0

Lý do tại sao không quan trọng là trình biên dịch biết rõ nhất về các bitwidth thực tế của các loại được sử dụng. Nếu chúng không khớp nhau, một được chuyển đổi thành cái khác - hoặc bằng cách cắt các bit hoặc bằng cách kéo dài với số 0 đầu. –

+0

Bạn hiểu lầm. Ý tôi trong đoạn thứ hai là '[NSNumber numberWithLongLong: 73]' sẽ tạo ra cùng một đối tượng với '[NSNumber numberWithChar: 73]', chứ không phải một đối tượng tạo ra một đối tượng trở lại bởi một 'long long' và một đối tượng khác được hỗ trợ bởi một 'char'. Bây giờ tôi bận tâm kiểm tra lại, đây không phải là trường hợp trong 10.6.4. (Bạn có thể kiểm tra điều này bằng 'CFShow()', cho bạn biết biểu diễn bên trong.) –

Các vấn đề liên quan