0

当我否定 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] 返回的内容。我可以轻松地使用 int 而不是没有问题,我会的,但我非常好奇为什么会出现这种行为。

4

1 回答 1

4

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

于 2013-04-20T19:35:13.440 回答