2010-06-06 43 views

回答

14

iPhone/ARM上的IIRC,long是32位。如果你想保證64位整數,你應該(確實)使用int64_t

+0

是的,NSInteger將是本地詞類型。 – Chuck 2010-06-06 18:13:18

+0

在x86上,'long'也是32位。 – kennytm 2010-06-06 18:42:51

+0

@KennyTM:取決於操作系統和編譯器,而不僅僅是硬件。 – 2010-06-06 19:04:31

0

如果您需要一種已知的特定尺寸,請使用具有已知特定尺寸的類型:int64_t

如果您需要泛型整數類型且大小不重要,請繼續並使用intNSInteger

0

NSInteger's長度取決於您是在編譯32位還是64位。它被定義爲64位和iPhone,int爲32位。

因此在iPhone上,NSInteger的長度與長度相同,這是編譯器相關的。大多數編譯器的長度與本地字長度相同。即32位體系結構爲32位,64位體系結構爲64位。

鑑於NSInteger的寬度存在不確定性,我只在指定NSInteger時纔將它用於Cocoa API中要使用的變量類型。如果我需要一個固定寬度的類型,我會選擇stdint.h中定義的類型。如果我不關心寬度,我使用內置的C類型

0

如果您想聲明一些內容,請聲明爲long。請注意,long可以是32位或64位,具體取決於編譯器。

如果您想聲明某些內容儘可能高效,並且足夠大以便對項目進行計數,請使用NSInteger或NSUInteger。請注意,兩者可以是32位或64位,實際上可以是不同的類型(int或long),具體取決於編譯器。這可以保護您在某些情況下不會混淆類型。

如果你想32或64位,而沒有別的,使用int32_t,uint32_t,int64_t,uint64_t。請注意,對於某些編譯器來說,任何一種類型都可能不必要地低效。

2

整數數據類型的尺碼

  • short - ILP32:2字節; LP64:2字節

  • int - ILP32:4字節; LP64:4字節

  • long - ILP32:4字節; LP64:8字節

  • long long - ILP32:8字節; LP64:8個字節

可能知道有用:

編譯爲64位運行時,編譯器定義了__LP64__宏。

NSIntegerlong一個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是否合適?

您可以使用longNSIntegerNSInteger是更地道恕我直言。

但我應該更明確,並使用像int64_t或長期直接?

如果您期望一致的64位大小既不long也不NSInteger會做,你將不得不使用int64_t(如Wevah說的)。

僅使用long的缺點是什麼?

這不是慣用的,如果蘋果再次推出新架構,您可能會遇到問題。

相關問題