代码之家  ›  专栏  ›  技术社区  ›  zoul

从nsuinteger到float的奇怪转换

  •  0
  • zoul  · 技术社区  · 14 年前

    我有以下代码:

    NSUInteger one = 1;
    CGPoint p = CGPointMake(-one, -one);
    NSLog(@"%@", NSStringFromCGPoint(p));
    

    其产量:

    {4.29497e+09, 4.29497e+09}
    

    另一方面:

    NSUInteger one = 1;
    NSLog(@"%i", -one); // prints -1
    

    我知道可能有某种溢出发生,但为什么这两种情况不同,为什么它不能按我想要的方式工作?我是否应该经常提醒自己变量和表达式的特殊数字类型,即使在做一些琐碎的算术运算时?

    当然,我可以用 unsigned int 而不是 NSUInteger ,没有区别。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Jeremy W. Sherman    14 年前

    当你申请一元 - 对于无符号值,无符号值被求反,然后通过 Utype_MAX + 1 反复增加了这个值。当你把它传给 CGPointMake() ,然后将该(非常大)无符号值分配给 CGFloat .

    你没有在你的 NSLog() 语句,因为您将其记录为带符号整数。把它转换回有符号整数,就得到-1。试用使用 NSLog("%u", -one) 你会发现你马上回来 4294967295 .

    unsigned int 对战 NSUInteger 有什么不同: 无符号整型 n-整数 在LP64体系结构(x86 U 64、PPC64)下,或者在编译时使用 NS_BUILD_32_LIKE_64 定义。 n-整数 恰好总是指针大小(但使用 uintptr_t 如果您真的需要一个指针大小的整数!); unsigned 不是在使用LP64模型时。

        2
  •  0
  •   drekka    14 年前

    好吧,我不知道,但是在网上阅读所有这些数据类型,我会说问题在于从nusInteger(解析为int(x32)或long(x64))到cgfloat(解析为float(x32)或double(x64))的转换。

    在第二个示例中,不会发生相同的转换。另一个可能影响它的因素是,从我的阅读中,nsuinteger不是设计为包含负数,而是只包含正数。所以这很可能就是事情开始出错的地方。