2014-09-12 70 views
0

我一直在编程Objective-C只有几个星期。从1987年开始,我在编程语言(如基本,Visual Basic,C++和PHP)方面的经验更加广泛,并且一直延续到今天。尽管在过去的5年中,我专门编写了PHP代码。整数精度和转换错误

今天,我发现自己被Objective-C语言中认为是位转换错误的困惑所困扰。我第一次注意到这一点时,试图分裂一个整数(84)由浮动(10.0)转换为浮动。这产生了8.399999,而不是我希望的8.400。我为这个问题编写了一个方法并继续前进。

今天,我从NSMutableDictionary中提取(int)0。我首先将它存储在一个NSInteger中,然后将其存储在一个int变量中。对于这两种情况,这些值都应为0,但对于这两种情况,我都会得到整数值151229568.(请参见截图)

我记得从我的早期编程年代起,我们不得不担心容器的大小,因为指向用32位指针访问一个4位值的存储器会导致捕获所有与其他值相关的数据,从而导致被捕获的数字出现错误。随着隐式内存管理和类型转换成为常态,多年来我不必担心这种问题,现在我再次遇到这种问题,我需要对熟悉该主题的程序员给出建议和澄清在今天的编程环境中。

问题:

  1. 这是不正确的指针大小或者其他什么东西的情况?
  2. 在后端发生了什么以产生从0到另一个数字的转换?
  3. 我能做些什么来从我的Objective-C计算和变量赋值中获得更好的精度和准确性?

代码:

NSInteger hsibs = [keyData objectForKey:@"half_sibs"]; 
int hsibsi = [keyData objectForKey:@"half_sibs"]; 
//breakpoint and screen capture of variables in stack 

screenshot of memory values showing dictionary and test variables

+0

您不能直接在字典中存储'NSInteger'或'int'。你需要把它们包装在一个'NSNumber'中。 – rmaddy 2014-09-12 16:41:32

回答

1

我不知道目标C那么好,但它看起来像你用它来获取你的数据返回的id数据类型的方法(请参阅this reference),而不是int

看起来您需要投射它或以这种方式获取整数值:

NSInteger hsibs = [[keyData objectForKey:@"half_sibs"] integerValue]; 
int hsibsi = [[keyData objectForKey:@"half_sibs"] intValue]; 

然后看看你是否得到预期的结果。

+0

仅供参考 - 第二行应该调用“intValue”,而不是“integerValue”。 – rmaddy 2014-09-12 16:49:05

+0

谢谢,每天都在学习新东西 – 2014-09-12 16:50:13

+0

当然,假设这些键引用了'NSNumber'(或'NSString')对象。 – rmaddy 2014-09-12 16:51:52