从NSUInteger到浮点数的奇怪转换

时间:2010-09-28 06:06:31

标签: math nsuinteger

我有以下代码:

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

我知道可能会出现某种溢出现象,但为什么这两种情况有所不同,为什么它不按我想要的方式工作?即使做了琐碎的算术,我是否应该总是提醒自己我的变量和表达式的特定数字类型?

P.S。当然我可以使用unsigned int代替NSUInteger,但没有区别。

2 个答案:

答案 0 :(得分:1)

当您将一元-应用于无符号值时,无符号值将被取消,然后通过将Utype_MAX + 1重复添加到该值来强制返回无符号值。当您将其传递给CGPointMake()时,该(非常大的)无符号值将被分配给CGFloat

您在NSLog()语句中没有看到这一点,因为您将其记录为有符号整数。将其转换回有符号整数,确实得到-1。尝试使用NSLog("%u", -one),您会发现自己回到4294967295

unsigned intNSUInteger有所不同:unsigned int是LP64体系结构(x86_64,ppc64)下NSUInteger的一半,或者使用{{进行编译时1}}已定义。 NS_BUILD_32_LIKE_64碰巧总是指针大小(但如果你真的需要一个指针大小的整数,请使用NSUInteger!);当您使用LP64模型时,uintptr_t不是。

答案 1 :(得分:0)

确定没有实际知道,但在网上浏览所有这些数据类型,我会说问题是从NUSInteger转换(解析为int(x32)或long(x64))到CGFloat(解析为float(x32)或double(x64))。

在您的第二个示例中,没有发生相同的转换。可能影响它的另一件事是,从我的阅读中,NSUinteger的设计并不包含负数,只包含正数。所以这可能是事情开始出错的地方。