2010-06-06 19 views
5

Tôi thấy NSInteger được sử dụng khá thường xuyên và typedef cho nó trên iPhone là dài, vì vậy về mặt kỹ thuật tôi có thể sử dụng nó khi tôi mong đợi int (64) giá trị. Nhưng tôi có nên rõ ràng hơn và sử dụng một cái gì đó như int64_t hoặc dài trực tiếp? Điều gì sẽ là nhược điểm của việc sử dụng lâu dài?Làm cách nào để khai báo dài trong Objective-C? NSInteger có thích hợp không?

Trả lời

14

IIRC, long trên iPhone/ARM là 32 bit. Nếu bạn muốn số nguyên 64 bit được đảm bảo, bạn nên (thực sự) sử dụng int64_t.

+0

Vâng, NSInteger sẽ là loại từ gốc. – Chuck

+0

Trên x86 'long' cũng là 32 bit. – kennytm

+0

@KennyTM: phụ thuộc vào hệ điều hành và trình biên dịch, không chỉ phần cứng. –

0

Nếu bạn cần loại kích thước cụ thể đã biết, hãy sử dụng loại có kích thước cụ thể đã biết: int64_t.

Nếu bạn cần loại số nguyên chung và kích thước không quan trọng, hãy tiếp tục và sử dụng int hoặc NSInteger.

0

NSInteger's chiều dài phụ thuộc vào việc bạn đang biên dịch cho 32 bit hay 64 bit. Nó được định nghĩa là dài cho 64 bit và iPhone và int cho 32 bit.

Vì vậy, trên iPhone độ dài của NSInteger giống như độ dài của một thời gian dài, phụ thuộc vào trình biên dịch. Hầu hết các trình biên dịch đều có độ dài tương tự như từ gốc. tức là 32 bit cho kiến ​​trúc 32 bit và 64 bit cho kiến ​​trúc 64 bit.

Do độ không chắc chắn về chiều rộng của NSInteger, tôi chỉ sử dụng nó cho các loại biến được sử dụng trong API Cocoa khi NSInteger được chỉ định. Nếu tôi cần một loại chiều rộng cố định, tôi đi cho những loại được xác định trong stdint.h. Nếu tôi không quan tâm đến chiều rộng, tôi sử dụng C được tạo sẵn trong các loại

0

Nếu bạn muốn khai báo cái gì đó dài, hãy khai báo nó lâu. Hãy nhận biết rằng dài có thể là 32 hoặc 64 bit, tùy thuộc vào trình biên dịch.

Nếu bạn muốn khai báo điều gì đó hiệu quả nhất có thể và đủ lớn để đếm các mục, hãy sử dụng NSInteger hoặc NSUInteger. Lưu ý rằng cả hai có thể là 32 hoặc 64 bit và có thể thực sự là các loại khác nhau (int hoặc dài), tùy thuộc vào trình biên dịch. Điều này bảo vệ bạn khỏi việc trộn lẫn các loại trong một số trường hợp.

Nếu bạn muốn 32 hoặc 64 bit và không có gì khác, hãy sử dụng int32_t, uint32_t, int64_t, uint64_t. Hãy lưu ý rằng một trong hai loại có thể không nhất thiết không hiệu quả trên một số trình biên dịch.

loại
2

Integer liệu Cỡ vỏ

  • short - ILP32: 2 byte; LP64: 2 byte

  • int - ILP32: 4 byte; LP64: 4 byte

  • long - ILP32: 4 byte; LP64: 8 byte

  • long long - ILP32: 8 byte; LP64: 8 byte

Nó có thể hữu ích để biết rằng:

Trình biên dịch xác định __LP64__ vĩ mô khi biên soạn cho thời gian chạy 64-bit.

NSInteger là một typedef của long vì vậy nó sẽ được 32-bit trong môi trường 32-bit và 64-bit trong môi trường 64-bit.

Khi chuyển sang 64-bit, bạn chỉ có thể thay thế tất cả int của bạn và long s để NSInteger và bạn nên được tốt để đi.

Chú ý: phải quan tâm đến sự liên kết dữ liệu, LP64 sử dụng sự liên kết tự nhiên cho tất cả các kiểu dữ liệu Integer nhưng ILP32 sử dụng 4 byte cho tất cả các kiểu dữ liệu Integer với kích thước bằng hoặc lớn hơn 4 byte.

Bạn có thể đọc thêm về chuyển đổi 32 đến 64 bit trong chính thức 64-Bit Transition Guide for Cocoa Touch.

trả lời bạn câu hỏi:

Làm thế nào tôi nên khai báo một dài trong Objective-C? NSInteger có thích hợp không?

Bạn có thể sử dụng một trong hai long hoặc NSInteger nhưng NSInteger là thành ngữ hơn IMHO.

Nhưng tôi có nên rõ ràng hơn và sử dụng nội dung nào đó như int64_t hoặc dài trực tiếp không?

Nếu bạn mong đợi kích thước 64-bit phù hợp không phải long cũng không NSInteger sẽ làm, bạn sẽ phải sử dụng int64_t (như Wevah nói).

Điều gì sẽ là nhược điểm của việc sử dụng lâu dài?

Không thành ngữ và bạn có thể gặp sự cố nếu Apple phát hành lại kiến ​​trúc mới.

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