ChatGPT解决这个技术问题 Extra ChatGPT

如何将 NSInteger 转换为 int?

例如,当像这样将 value 消息传递给 NSInteger 实例时

[a value] 它会导致 EXC_BAD_ACCESS。

那么如何将 NSInteger 转换为 int

如果相关,则仅使用 < 32 的小数字。

你似乎很困惑。 [a value] 建议您期望 a 是一个对象,但目前它是一个 NSInteger 。 “转换”为 int 并不能解决该问题。

c
cdub

达达:

NSInteger myInteger = 42;
int myInt = (int) myInteger;

NSInteger 只不过是一个 32/64 位整数。 (它将根据您运行的操作系统/平台使用适当的大小)


准确地说,我认为 NSInteger 在 32 位平台上是 int,在 64 位平台上是 long。
我使用建议的“强制转换”收到警告:隐式转换失去整数精度:'NSUInteger'(又名'unsigned long')到'int'
@djcj,是的,新 SDK 的答案不正确。我认为。
将 (int) 放在 NSInteger 前面不是更容易吗?例如,(int)myInteger 每当你想调用整数形式,这样你就不必创建一个新的变量。
@chandhooguy 你为什么要避免使用新变量?
S
Samuel Clay

如果您想内联执行此操作,只需将 NSUIntegerNSInteger 强制转换为 int

int i = -1;
NSUInteger row = 100;
i > row // true, since the signed int is implicitly converted to an unsigned int
i > (int)row // false

只是出于好奇,您为什么要在事实已经接受答案且得票数达到两位数的问题后 2 年才发布答案?特别是因为您的只是对该答案的改写。
因为我的答案是单行(使用内联类型转换 - (int)),我认为这是 OP 可能想要的。我自己对此进行了调查,并注意到有关该主题的所有答案都是多行的。
接受的答案演示了使用单行的隐式转换。 Abizern 的回答解释说,如果您尝试使用 NSInteger 值代替 int,则会发生隐式转换。在这两种情况下,它都不是多线解决方案。
我应该更清楚。由于这是一个有点新手的问题,对于新手程序员来说,他们可以使用 (int) 表达式进行内联转换可能并不明显。其他答案没有显示这一点,我认为它可以帮助任何偶然发现此页面的人。
一年半后,我偶然发现了这个页面,特别需要与 NSUInteger 相关的演员表。谢谢,塞缪尔!
A
Abizern

我不确定您需要将 NSInteger 转换为 int 的情况。

NSInteger 只是一个类型定义:

NSInteger 用于描述一个整数,与您是为 32 位还是 64 位系统构建无关。

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
typedef long NSInteger;
#else
typedef int NSInteger;
#endif

您可以在任何使用 int 的地方使用 NSInteger 而无需转换它。


这是要将 NSUinteger 转换为 int 的一个很好的理由:值比较。 (int i = -1) > (NSUinteger j = 14) 将 int 转换为无符号数,即 -1 > 14,这不是您想要的。
@塞缪尔克莱。在特定情况下使用时很好。就个人而言,我会将 NSUInteger 转换为 uint。然而。问题是关于转换 NSInteger,而不是 NSUInteger。
我只使用 unsigned int 来说明一个常见的陷阱。正如我的回答所证明的那样,两者的类型都相同。这不是一个难题,但它很常见,我还没有看到有人推荐单行答案。
g
grominet

UIsegmentedControl中常用,在64位而不是32位编译时出现“错误”,不将其传递给新变量的简单方法是使用此提示,添加(int):

[_monChiffre setUnite:(int)[_valUnites selectedSegmentIndex]];

代替 :

[_monChiffre setUnite:[_valUnites selectedSegmentIndex]];