Objective c ObjC将整数转换为双精度时的异常行为

Objective c ObjC将整数转换为双精度时的异常行为,objective-c,casting,double,negative-number,nsuinteger,Objective C,Casting,Double,Negative Number,Nsuinteger,当我否定一个整数并将其转换为双精度时,我遇到了一些奇怪的行为 NSUInteger test = 10; NSLog(@"%d", test); NSLog(@"%f", (double) test); NSLog(@"%d", -test); NSLog(@"%f", (double) -test); 输出为: 10 10.000000 -10 4294967286.000000 你知道为什么会这样吗?我使用NSUInteger是因为这是从[NSArray count]返回的值。我可以轻松

当我否定一个整数并将其转换为双精度时,我遇到了一些奇怪的行为

NSUInteger test = 10;
NSLog(@"%d", test);
NSLog(@"%f", (double) test);
NSLog(@"%d", -test);
NSLog(@"%f", (double) -test);
输出为:

10
10.000000
-10
4294967286.000000

你知道为什么会这样吗?我使用NSUInteger是因为这是从[NSArray count]返回的值。我可以轻松地使用int来代替,不会有任何问题,我会的,但我非常好奇为什么会出现这种行为。

因为
NSUInteger
是一种无符号整数类型。所以当它被否定时(
-test
仍然是一个无符号整数)。但由于无符号整数不能包含负值,因此它会溢出模2并将其环绕到
CHAR\u BIT*sizeof(NSUInteger)
th次方
NSUInteger
在您的平台上是32位长的,因此您将得到
-10 mod 4294967296
,它正好是4294967286。

因为
NSUInteger
是无符号整数类型。所以当它被否定时(
-test
仍然是一个无符号整数)。但由于无符号整数不能包含负值,因此它会溢出模2并将其环绕到
CHAR\u BIT*sizeof(NSUInteger)
th次方
NSInteger
在您的平台上是32位长的,因此您将得到
-10 mod 4294967296
,它正好是4294967286。

谢谢您的解释。我以为会是这样的,尽管我很惊讶第三行在这种情况下起作用。你知道为什么NSLog(“%d”,-test)打印出“-10”@LukeGodfrey,因为这会将无符号整数解释为有符号整数,并且会导致有符号整数溢出(基本上是一样的,反过来,但另外也是UB)。谢谢你的解释。我以为会是这样的,尽管我很惊讶第三行在这种情况下起作用。你知道为什么NSLog(“%d”,-test)会打印“-10”@LukeGodfrey,因为这会将无符号整数解释为有符号整数,并且会出现有符号整数溢出(基本上是一样的,相反,但另外它也是UB)。