代码之家  ›  专栏  ›  技术社区  ›  Jesse Armand

nsinteger与nsinteger、int与unsigned及类似情况

  •  28
  • Jesse Armand  · 技术社区  · 16 年前

    谁有专门知识来解释何时使用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
    
    4 回复  |  直到 11 年前
        1
  •  31
  •   Erik Abele    15 年前

    处理nsinteger与nsinteger时,您还应该了解整数转换规则:

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

    NSInteger si = -1;
    NSUInteger ui = 1;
    printf("%d\n", si < ui);
    

    原因是[si]变量被隐式转换为无符号int!

    CERT's Secure Coding site 就这些“问题”以及如何解决这些问题进行深入讨论。

        2
  •  17
  •   ChintaN -Maddy- Ramani    11 年前

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

        3
  •  7
  •   Carl Norum    16 年前

    如果您的方法有适当的限制输出范围,您也可以使用 NSInteger 因为打字容易。如你所说,如果你需要返回负数, NS-整型 是镇上唯一的游戏,我只会用 NSUInteger 如果我需要回来 真的? 因为某种原因,数字很大。

        4
  •  5
  •   AaronLS    11 年前

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

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

    如果要强制只使用正值,则可能首选无符号。