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
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
.
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
.
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
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ạiInteger liệu Cỡ vỏ
short
- ILP32: 2 byte; LP64: 2 byteint
- ILP32: 4 byte; LP64: 4 bytelong
- ILP32: 4 byte; LP64: 8 bytelong 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.
- 1. Cách thích hợp để khai báo nhiều vars trong PHP
- 2. Tại sao tôi không khai báo NSInteger với số *
- 3. Bạn có sử dụng các vùng trong vòng khai báo chuyển đổi/khai báo dài không?
- 4. Làm thế nào để khai báo một giá trị enum như đang bị phản đối trong ObjectiveC (2.0)
- 5. ObjectiveC: nơi khai báo các đặc tính cá nhân?
- 6. Có cách nào để khai báo thuộc tính chú thích cho * any * enum không?
- 7. Cách thích hợp để tạo phương thức BUILD trong MooseX :: Khai báo là gì?
- 8. Cách thích hợp để khai báo một thuộc tính là sai là gì?
- 9. R - làm cách nào để khai báo vectơ của Ngày?
- 10. Làm thế nào để khai báo chuỗi trong C
- 11. Làm cách nào để chuyển đổi NSInteger thành NSTimeInterval
- 12. Làm thế nào để chuyển đổi NSIndexPath thành NSInteger?
- 13. C++: Có cách nào để tránh sự dư thừa với việc thay đổi các khai báo dài không?
- 14. Làm cách nào để chặn báo chí dài trên UITextView?
- 15. Làm cách nào để người dùng của bạn báo cáo lỗi bằng các kênh thích hợp?
- 16. Ai đó có thể giải thích cú pháp khai báo phương pháp C Mục tiêu
- 17. Làm cách nào để khai báo hằng số Int64?
- 18. Trường hợp thẻ khai báo XML có nhạy cảm không?
- 19. Có cách nào "thích hợp" để đọc file CSV
- 20. Cách thích hợp để gửi email không đồng bộ trong ASP.NET ... (Tôi có làm đúng không?)
- 21. Làm cách nào để phù hợp với tiêu đề dài?
- 22. Làm thế nào để khai báo một chuỗi dài bằng Python?
- 23. Làm cách nào để khai báo một thuộc tính bằng Python mà không có giá trị?
- 24. Làm cách nào để khai báo một chuỗi chuỗi có kích thước không xác định?
- 25. Làm cách nào để tôi nhận được LinqToXSD để khai báo đúng các khai báo tiền tố không gian tên?
- 26. Cách thích hợp để tăng ngoại lệ trong python?
- 27. Làm cách nào để khai báo loại tùy chọn Android?
- 28. Làm cách nào để khai báo thuộc tính mảng?
- 29. Khai báo và ném so với các trường hợp ngoại lệ không được khai báo
- 30. Làm cách nào để cấp quyền thích hợp cho jenkins?
Vâng, NSInteger sẽ là loại từ gốc. – Chuck
Trên x86 'long' cũng là 32 bit. – kennytm
@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. –