从float到int的转换看起来很奇怪

时间:2012-03-09 05:23:56

标签: objective-c

我很难理解为什么以下代码会给我下面的数字。任何人都可以解释从float到int的转换吗? (pCLocation是CGPoint)

counter = 0;
pathCells[counter][0].x = pCLocation.x;
pathCells[counter][0].y = pCLocation.y;
cellCount[counter]++;    
NSLog(@"%@",[NSString stringWithFormat:@"pCLocation at:
 %f,%f",pCLocation.x,pCLocation.y]);
NSLog(@"%@",[NSString stringWithFormat:@"path cell 0: %i,%i",
pathCells[counter][cellCount[counter-1]].x,pathCells[counter][cellCount[counter]].y]);
2012-03-09 01:17:37.165 50LevelsBeta1[1704:207] pCLocation at: 47.000000,16.000000
2012-03-09 01:17:37.172 50LevelsBeta1[1704:207] path cell 0: 0,1078427648

1 个答案:

答案 0 :(得分:3)

假设您的代码正确无误:

我认为这有助于您了解NSLog和其他printf样式函数的工作原理。当您调用NSLog(@"%c %f", a_char, a_float)时,您的代码会将格式字符串和值压入堆栈,然后跳转到该函数代码的开头。由于NSLog接受可变数量的参数,因此它不知道从堆栈弹出多少。它知道至少有一个格式字符串,所以它弹出并开始扫描它。当它找到格式说明符%c时,它知道从堆栈中弹出一个字节并打印该值。然后它找到%f,所以现在它知道再弹出32位并将其打印为浮点值。然后它到达格式字符串的末尾,所以就完成了。

现在这里是踢球者:如果你骗到NSLog并告诉它你提供了一个int但实际上提供了一个浮点数,它就无法知道你在撒谎。它只是假设你说的是实话并打印它在内存中找到的任何位,但是你要求它被打印出来。

这就是为什么你会看到奇怪的值:你正在打印一个浮点值,好像它是一个int。如果你真的想要一个int值,你应该:

  1. 应用演员:NSLog(@"cell.x: %i", (int)cell.x);
  2. 保留一个浮动但使用格式字符串隐藏小数:NSLog(@"cell.x: %.0f", cell.x);

  3. (替代理论,仍有潜在用处。)

    您可能正在打印未初始化内存的内容。

    在您提供的代码中,counter = 0并且永远不会更改。因此,您可以将值分配给:

    pathCells[0][0].x = pCLocation.x;
    pathCells[0][0].y = pCLocation.y;
    cellCount[0]++;
    

    然后你打印:

    pathCells[0][cellCount[-1]].x
    pathCells[0][cellCount[0]].y
    

    我很确定cellCount[-1]不是你想要的。 C允许这样做,因为即使您认为它使用特定大小的数组,foo[bar]实际上只意味着获取内存地址foo加偏移bar的值。所以索引为-1只意味着退后一步。这就是为什么你没有得到警告或错误,只是垃圾数据。

    您应该澄清pathCellscellCountcounter是什么以及它们之间的关系。我认为你在如何组合这些东西时有一个错误。