我有以下代码:
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
,但没有区别。
答案 0 :(得分:1)
当您将一元-
应用于无符号值时,无符号值将被取消,然后通过将Utype_MAX + 1
重复添加到该值来强制返回无符号值。当您将其传递给CGPointMake()
时,该(非常大的)无符号值将被分配给CGFloat
。
您在NSLog()
语句中没有看到这一点,因为您将其记录为有符号整数。将其转换回有符号整数,确实得到-1。尝试使用NSLog("%u", -one)
,您会发现自己回到4294967295
。
unsigned int
与NSUInteger
有所不同: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的设计并不包含负数,只包含正数。所以这可能是事情开始出错的地方。