我看到NSInteger經常使用,它在iPhone上的typedef是一個很長的,所以技術上我可以使用它,當我期望int(64)值。但是,我應該更明確,並使用像int64_t或長直接?使用long的缺點是什麼?我應該如何在Objective-C中聲明一個long? NSInteger是否合適?
回答
iPhone/ARM上的IIRC,long
是32位。如果你想保證64位整數,你應該(確實)使用int64_t
。
如果您需要一種已知的特定尺寸,請使用具有已知特定尺寸的類型:int64_t
。
如果您需要泛型整數類型且大小不重要,請繼續並使用int
或NSInteger
。
NSInteger's長度取決於您是在編譯32位還是64位。它被定義爲64位和iPhone,int爲32位。
因此在iPhone上,NSInteger的長度與長度相同,這是編譯器相關的。大多數編譯器的長度與本地字長度相同。即32位體系結構爲32位,64位體系結構爲64位。
鑑於NSInteger的寬度存在不確定性,我只在指定NSInteger時纔將它用於Cocoa API中要使用的變量類型。如果我需要一個固定寬度的類型,我會選擇stdint.h
中定義的類型。如果我不關心寬度,我使用內置的C類型
如果您想聲明一些內容,請聲明爲long。請注意,long可以是32位或64位,具體取決於編譯器。
如果您想聲明某些內容儘可能高效,並且足夠大以便對項目進行計數,請使用NSInteger或NSUInteger。請注意,兩者可以是32位或64位,實際上可以是不同的類型(int或long),具體取決於編譯器。這可以保護您在某些情況下不會混淆類型。
如果你想32或64位,而沒有別的,使用int32_t,uint32_t,int64_t,uint64_t。請注意,對於某些編譯器來說,任何一種類型都可能不必要地低效。
整數數據類型的尺碼
short
- ILP32:2字節; LP64:2字節int
- ILP32:4字節; LP64:4字節long
- ILP32:4字節; LP64:8字節long long
- ILP32:8字節; LP64:8個字節
可能知道有用:
編譯爲64位運行時,編譯器定義了
__LP64__
宏。
NSInteger
是long
一個typedef
所以這將是在32位的環境32比特,並在一個64位環境64位。
當轉換爲64位,你可以簡單地更換所有int
S和long
s到NSInteger
,你應該是好走。
重要:注重數據的比對,LP64使用自然對齊所有整數數據類型,但ILP32使用4個字節的所有整數數據類型與尺寸等於或大於4個字節。
您可以在官方64-Bit Transition Guide for Cocoa Touch中閱讀關於32位到64位轉換的更多信息。
回答你的問題:
我應該如何申報在Objective-C長? NSInteger是否合適?
您可以使用long
或NSInteger
但NSInteger
是更地道恕我直言。
但我應該更明確,並使用像int64_t或長期直接?
如果您期望一致的64位大小既不long
也不NSInteger
會做,你將不得不使用int64_t
(如Wevah說的)。
僅使用long的缺點是什麼?
這不是慣用的,如果蘋果再次推出新架構,您可能會遇到問題。
- 1. 我們是否應該聲明一個集合類或接口?
- 2. 我該如何聲明一個結構?
- 3. 如何在java中聲明一個unsigned long類型?
- 4. 它是否適合該聲明。如果(0!=表達式或變量){}在Java中?
- 5. 應該聲明一個鎖定變量是否爲volatile?
- 6. 我應該如何聲明字符串?
- 7. 如何檢查NSInteger是否比另一個NSinteger大?
- 8. 我該如何在ios中聲明facebookSDK?
- 9. NUnit聲明一個集合,檢查是否存在一個值
- 10. 如果聲明不適合我 - Java
- 11. 我應該在web.config中聲明https嗎?
- 12. PHP如果聲明,適合?
- 13. 如何使用一個NSInteger在一個C語言風格類聲明
- 14. 我應該在哪裏返回聲明
- 15. 我應該如何聲明一個Microsoft.Office.Interop.Excel.Worksheet,以便在C#中關閉它?
- 16. 將聲明合併爲一個聲明還是不合並?
- 17. 我應該在「兩個」文件夾中聲明我的集合嗎?
- 18. 儘管有實驗聲明,我是否應該使用XsrfProtectedServiceServlet?
- 19. 我是否應該將Vector <>聲明爲Vector <> *?
- 20. 是否應該在RabbitMQ中多次聲明交換或隊列?
- 21. 是否應該在包含的JSP文件中聲明taglibs?
- 22. 我應該如何在C++項目中聲明全局變量?
- 23. 我應該聚合嗎?這是一個明智的做法嗎?
- 24. 我應該如何在短期內排列我的聲明?
- 25. 如何在ObjectiveC中聲明和使用3維數組?
- 26. 我想爲CFStringRef聲明一個屬性,我該怎麼辦?
- 27. 如何聲明,我該如何補救?
- 28. 我如何在Scala中聲明創建一個列表?
- 29. 我可以在一個聲明中
- 30. 我應該在junit庫中聲明還是拋出異常?
是的,NSInteger將是本地詞類型。 – Chuck 2010-06-06 18:13:18
在x86上,'long'也是32位。 – kennytm 2010-06-06 18:42:51
@KennyTM:取決於操作系統和編譯器,而不僅僅是硬件。 – 2010-06-06 19:04:31