如何在Objective-C中声明一个long变量?使用NSInteger合适吗?

8

我看到NSInteger经常被使用,而在iPhone上它的typedef是long类型,所以从技术上讲,当我期望int(64)值时,我可以使用它。但是,我应该更明确地使用像int64_t或直接使用long吗?如果只使用long会有什么不利影响呢?

5个回答

19

据我所知,在iPhone/ARM上,long类型是32位。如果你需要保证64位整数,应该(确实)使用int64_t


在x86上,“long”也是32位的。 - kennytm
@Stephan:没错。但在这种情况下,编译器必须是gcc或clang,操作系统必须是Mac OS X。 - kennytm
如果在OS X / x86上构建的可执行文件是64位,long就是64位宽。@KennyTM - Stephen Canon
2
但事实并非如此,因为OP正在询问iPhone。/耸肩 - Wevah
(注:四年后,我们现在拥有64位iOS设备。) - Wevah
显示剩余2条评论

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位时,您可以简单地将所有的intlong替换为NSInteger,然后就可以了。

重要提示:注意数据的对齐方式,LP64使用自然对齐方式对所有整数数据类型进行对齐,但ILP32对于所有大小等于或大于4字节的整数数据类型使用4字节。

您可以在官方Cocoa Touch 64位过渡指南中了解更多关于32位到64位转换的信息。

回答你的问题:

我应该如何在Objective-C中声明一个长整型?是否适用于NSInteger?

您可以使用longNSInteger,但我认为NSInteger更符合惯用语。

但是我应该更明确地使用int64_t或直接使用long吗?

如果您希望有一致的64位大小,那么既不是long也不是NSInteger,您将不得不使用int64_t(正如Wevah所说)。

仅使用long的缺点是什么?

它不是惯用语,并且如果苹果再次推出新的架构,您可能会遇到问题。


0
如果您需要一种已知特定大小的类型,请使用具有该已知特定大小的类型:int64_t
如果您需要通用整数类型并且大小不重要,请使用intNSInteger

0

NSInteger的长度取决于你是为32位还是64位编译。在64位和iPhone上,它被定义为long,在32位上则为int。

因此,在iPhone上,NSInteger的长度与long相同,这取决于编译器。大多数编译器使long与本机字长相同。即32位架构为32位,64位架构为64位。

考虑到对NSInteger宽度的不确定性,我仅在指定了NSInteger的Cocoa API中使用它作为变量类型。如果我需要固定宽度类型,我会选择在stdint.h中定义的类型。如果我不关心宽度,我使用C内置类型。


0

如果您想将某些东西声明为 long,请将其声明为 long。请注意,long 可以是 32 或 64 位,这取决于编译器。

如果您想声明某些东西尽可能高效,并且足够大以计算项目,请使用 NSInteger 或 NSUInteger。请注意,两者均可为 32 或 64 位,并且实际上可以是不同的类型(int 或 long),这取决于编译器。这在某些情况下可以保护您免受类型混淆的影响。

如果您只想使用 32 或 64 位,请使用 int32_t、uint32_t、int64_t、uint64_t。请注意,在某些编译器中,任何一种类型都可能存在过度低效的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接