【问题标题】:Why / how could NSUInteger be returning a NEGATIVE number?为什么/如何 NSUInteger 返回一个负数?
【发布时间】:2012-08-02 05:48:03
【问题描述】:

如果没有没有保证(甚至似乎没有机会),那么拥有一个单独的无符号类型(又名NSUInteger)有什么意义?假设,赌上你的底钱,或者哭着睡 - 顾名思义 - 固有的非负面结果

NSUInteger normal = 5;
NSUInteger freaky = normal - 55;
NSLog(@"%ld, %ld", normal, freaky);

NSLOG 5, -50

当然,我可以向后弯腰尝试获得零,或某种标准化值......

NSUInteger nonNeg = (((normal - 55) >= 0) ? (normal - 55) : 0);

PARRALELUNIVERSELOG 5, -50

但是编译器在这里抱怨......这是理所当然的,所以comparison of unsigned expression >= 0 is always true - 就是这样,一个我不想要/期望的答案。有人拍我的脸,给我倒杯酒,告诉我现在是哪一年......或者更好......如何做到 - 你知道 - 不要那样做

【问题讨论】:

    标签: objective-c xcode casting clang primitive


    【解决方案1】:

    %ld 告诉NSLog 将其打印为有符号整数。试试%lu

    请参阅 wikipedia 上的 2's Complement,了解位级别发生的情况。

    这里发生的是减法导致无符号整数表示回绕。为了防止这种情况发生,您需要在进行减法之前检查

    NSUInteger x = 5; 
    NSUInteger y = 55;
    
    // If 0 makes sense in your case
    NSUInteger result = (x >= y) ? (x - y) : 0; 
    
    // If it should be an error
    if(x < y)
    {
        // Report error
    }
    

    【讨论】:

    • 我现在正在检查它。但例如%lu 的结果是nonNeg = 18446744073709551566。但是,嘿,至少它是积极的,对……哈哈。
    • 好吧,直到你理解 2 的补码算法,它总是会让你感到困惑 ;-) 所以你有 nonNeg = (5 - 55) 并且你得到一个令人困惑的数字......如果你把 60 加到这个令人困惑的数字你会得到10这是正确的答案!!!我的观点是这里有一个一致的系统......你只是还不理解它。请查看维基百科链接。我会帮你的。老实人!
    • 我试图阅读那篇 mind-bending 文章......再次......仍然有一个基本问题......不管 dizzyingly-complex-实施,如果type 可以很容易地被“强制”进入未知(负面)领域,为什么还要有一个声称是“标志盲”的type。常识说,“如果它是未签名的......它永远不会小于0”,但实际上,这不能依赖。
    • 抱歉回复晚了,离开SO一段时间了。无符号类型永远不会小于零。但是,如果您告诉编译器将一块包含无符号类型的内存解释为有符号类型,则该值可能小于零。希望这能让事情更清楚。
    【解决方案2】:

    真正的答案是如何解释这些位。当然,通过 2 的补码了解事情是如何在内部完成的很重要,但混淆似乎更多的是您在使用 %ld 时看到的是一个负数,并认为它与您在使用 % 时看到的正数有所不同鲁。两种情况都使用相同的位,这只是它们如何被解释的函数。如果您尝试将这些相同的位解释为字符序列,您会得到不同的结果。

    【讨论】:

      猜你喜欢
      • 2011-12-14
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-12
      • 2018-01-29
      • 2020-04-01
      • 1970-01-01
      相关资源
      最近更新 更多