从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
我知道可能会出现某种溢出,但为什么这两种情况不同,为什么它不能按我想要的方式工作?即使在做琐碎的算术时,我是否应该总是提醒自己我的变量和表达式的特定数字类型? 附:当然我可以使用
unsigned int
而不是
NSUInteger
,没有任何区别。     
已邀请:
当您将一元
-
应用于无符号值时,无符号值将被取消,然后通过重复添加that6ѭ将其强制转换为无符号值。当你将它传递给
CGPointMake()
时,那个(非常大的)无符号值然后被分配给
CGFloat
。 您没有在
NSLog()
语句中看到这一点,因为您将其记录为有符号整数。将其转换回有符号整数,确实得到-1。尝试使用
NSLog("%u", -one)
,你会发现你回到了
4294967295
unsigned int
NSUInteger
有所不同:
unsigned int
是LP64架构(x86_64,ppc64)下
NSUInteger
的一半大小,或者当你用
NS_BUILD_32_LIKE_64
定义编译时。
NSUInteger
总是指针大小(但如果你真的需要一个指针大小的整数,则使用
uintptr_t
!);当您使用LP64型号时,不是
unsigned
。     
确定没有实际知道,但在网上阅读所有这些数据类型,我会说问题是从NUSInteger(解析为int(x32)或long(x64))转换为CGFloat (解析为float(x32)或double(x64))。 在您的第二个示例中,没有发生相同的转换。可能影响它的另一件事是,从我的阅读来看,NSUinteger并没有设计包含负数,只包含正数。所以这可能是事情开始出错的地方。     

要回复问题请先登录注册