首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iPhone Cocoa混合模式数学基本错误

iPhone Cocoa混合模式数学基本错误
EN

Stack Overflow用户
提问于 2009-03-31 16:17:52
回答 3查看 1.4K关注 0票数 1

我刚刚意识到,如果我在模拟器上的iPhone软件开发工具包中混合了整数和浮点数,我就会在简单的数学上得到错误。两个例子:

代码语言:javascript
运行
复制
float testVal1 = 10 + 5/10; 
//evaluates to 10 instead of 10.5 unless I use explicit 10.0f..

// Problem Code mixed float int 
NSUInteger jvalue = 2312345;

NSInteger testVal2 = (jvalue - 2512345); // evaluates correctly
float testVal3 = (jvalue - 2512345); // fails with some huge bogus value

我认为在混合模式表达式中,它会转换为浮点值。在使用浮点数时,看起来要么全有要么全无,没有混合

这里出了什么问题?

EN

回答 3

Stack Overflow用户

发布于 2009-03-31 16:23:32

没有任何错误;这就是操作的工作方式。看看你的例子:

代码语言:javascript
运行
复制
float testVal1 = 10 + 5/10; //evaluates to 10

这里的操作顺序如下:

  1. analyze 5:整数文字
    • analyze 10:整数文字
    • 5/10:整数除法,结果0
    • 10 +:整数加法,结果10
    • 将结果赋值给code

要按您希望的方式工作,除法操作数中必须至少有一个是浮点数。现在,结果将更像这样:

floating-point literal

  • 5/10.0f:floating-point

  • analyze 5:整数文字
  • analyze 10.0f:除法,result 0.5
  • 10 + 0.5:floating-point加法,result 10.5
  • 将结果赋值给float

票数 4
EN

Stack Overflow用户

发布于 2009-03-31 16:23:54

这与iPhone或模拟器没有任何关系,它与Objective-C和C如何执行算术有关。编译器将操作数解释为5/10作为整数,根据定义,整数除法不能得到小数结果。因此,10 + 5/10 == 10 +0 == 10。您可以尝试:

代码语言:javascript
运行
复制
float testVal1 = 10.0f + 5.0f/10.0f;
票数 2
EN

Stack Overflow用户

发布于 2009-03-31 16:24:42

在像5 / 10这样的子表达式中,默认的数据类型是integer,直到其中一个操作数另有说明。然而,由于整数除法,(5 / 10) = 0

在表达式编辑器( expression NSInteger testVal2 = (jvalue - 2512345); )中,子表达式的默认类型是无符号整数;负结果会导致下溢和假值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/701832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档