Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C NSInteger与NSInteger、int与无符号以及类似情况_C_Objective C_Cocoa_Types - Fatal编程技术网

C NSInteger与NSInteger、int与无符号以及类似情况

C NSInteger与NSInteger、int与无符号以及类似情况,c,objective-c,cocoa,types,C,Objective C,Cocoa,Types,有谁有专业知识来解释何时使用NSInteger和何时使用NSInteger 我见过Cocoa方法返回NSInteger,即使在返回值总是无符号的情况下也是如此 根本原因是什么?如果我们要表示负值,NSInteger或int是否严格限制为 从NSObjCRuntime.h: #if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 typed

有谁有专业知识来解释何时使用NSInteger和何时使用NSInteger

我见过Cocoa方法返回NSInteger,即使在返回值总是无符号的情况下也是如此

根本原因是什么?如果我们要表示负值,NSInteger或int是否严格限制为

从NSObjCRuntime.h:

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

如果您的方法具有适当限制的输出范围,那么您最好使用
NSInteger
,因为它更容易键入。正如您所说,如果您需要返回负数,
NSInteger
是镇上唯一的游戏;如果出于某种原因需要返回非常大的数字,我只会使用
NSUInteger

我不知道cocoa的具体情况,但通常有符号整数的唯一缺点是,它们通常具有最大值的一半作为无符号整数。例如,对于32位系统,大约20亿而不是40亿。一般来说,这并不是一个很大的区别,因为如果你处理的是接近20亿的值,你可能会同样担心40亿的最大值,因为它仍然非常接近于2或3的乘法溢出

有符号整数通常是首选的,因为有符号整数具有额外的灵活性,而且几乎可以在所有情况下使用无符号整数,在需要负数的情况下,无符号整数可以加上它不能使用的所有其他情况


如果您希望强制执行纯正值,则最好使用Unsigned。

在处理NSUInteger与NSInteger时,还应注意整数转换规则:

例如,下面的片段返回0(false),尽管您希望它打印1(true):

NSInteger si=-1;
整数ui=1;
printf(“%d\n”,si
原因是[si]变量被隐式转换为无符号整数


有关这些“问题”以及如何解决这些问题的深入讨论,请参阅。

默认情况下,假定整数是有符号的。换句话说,编译器假定将调用整数变量来存储负数或正数。这限制了范围在任一方向上可以达到的范围。例如,32位整数的范围为4294967295。实际上,由于该值可能为正或负,因此该范围实际上为零−2147483648至+2147483647。如果我们知道变量永远不会被调用来存储负值,我们可以将其声明为无符号,从而将(正)范围扩展到0到+4294967295。所以我想说,当你知道你有一个有限的输出范围时,可以使用NSInteger。我个人使用NSUInteger如果我需要返回非常大的纯正数

对于更大的数字,使用NSDecimalNumber作为38位的基数-10精度。+1,@codewarrior,但前提是你可以传递类。我使用另一种方法:我在任何时候都使用NSUInteger,除非我需要负数。还有,你指的是对象,不是类;传递类的理由很少,传递NSDecimalNumber类的理由更少。我想这真的取决于我们的需要。我添加了NSInteger和NSInteger的定义。如果希望能够将变量初始化为“无效”,有时甚至在正常范围为正时也会使用有符号整数值,例如-1。有趣的是,替换目标C的Swift表示,在可能的情况下始终使用有符号的数字。来自文档:仅当您特别需要与平台本机字大小相同大小的无符号整数类型时才使用UInt。如果不是这种情况,则最好使用Int,即使要存储的值已知为非负。对整数值一致使用Int有助于代码的互操作性,避免在不同的数字类型之间进行转换,并匹配整数类型推断,如类型安全和类型推断中所述。我同意这一点,因为usageNice答案和我需要知道的是一致的:)如果我想存储-4294967295怎么办?那么我不能使用NSInteger?@Nil long long int:-9223372036854775807到9223372036854775807无符号long long-long int:0到18446744073709551615。在你的账户中有相当大的金额:D
NSInteger si = -1;
NSUInteger ui = 1;
printf("%d\n", si < ui);