首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将float转换为int截断rest,似乎不可靠

将float转换为int截断rest,似乎不可靠
EN

Stack Overflow用户
提问于 2013-11-14 17:45:29
回答 4查看 260关注 0票数 2

看到这样的事情会感到惊讶:

代码语言:javascript
运行
复制
float f = 10.25f;
int i = (int)f;
// Will give you i = 10

收益是什么?

OTOH 10.25是与10完全不同的东西,这一点大家都同意,这样的软转换可能会发生不好的事情。

哪种语言会引发错误?

可能会出现这样的情况:"Error: Can't represent 10.25 as an integer"

同时给出的答案的WRT :是的,它可能被认为是可靠的,就像"round“这样的函数一样。但不是直接从cast期望的数据/信息的完整性的WRT。

也许一个默认行为为"int“的函数"truncate”会是一个更好的选择?

EN

回答 4

Stack Overflow用户

发布于 2013-11-14 18:34:53

它恰好是

代码语言:javascript
运行
复制
(int)f

这说明程序员知道他在做什么,而在大多数编程语言中,悄悄地去掉小数部分并将其余部分存储在整数中是被禁止的。

顺便说一句,这不仅仅是小数部分被切断了。同样重要的是,一个浮点数可以有一个非常大的值,以至于它不可能被表示为int。考虑一下:

代码语言:javascript
运行
复制
(int) 1e20f
票数 3
EN

Stack Overflow用户

发布于 2013-11-14 18:36:21

语句int i = (int)f;明确表示“请将我的浮动f转换为int”。这当然是我经常发现的一件有用的事情--为什么你不能将一个浮点值从某种计算转换成一个整数呢?类型转换将告诉编译器“我真的希望它是一个整数”,就像在C中可以执行char *p = (char *)1234567;一样--类型转换是为了告诉编译器“我真的知道我在做什么”。

如果你使用int i = f;int i = 10.25;,编译器仍然会做你“要求的”--将浮点值转换为整数。如果您启用了相应的警告,它可能会发出警告,提示“您正在将float转换为int”。

C和C++是需要你理解你在做什么,以及后果是什么的语言--其他一些语言设置了更多的“障碍”来防止这样的事情发生,但这通常意味着编译器必须添加额外的代码来在运行时进行检查-C和C++被设计成“快速”语言。

这有点像开车,在后面有一堵墙的时候倒车,然后踩油门,很可能会导致汽车撞到墙上--如果这不是你想要的,那就“不要这么做”。

票数 2
EN

Stack Overflow用户

发布于 2013-11-14 18:33:23

首先,转换绝对是“可靠的”,就像“它总是做同样的事情”一样。

你想不想这样做由你自己决定。一般而言,C/C++语言被设计为给程序员提供大量的低级能力,这意味着程序员需要知道他们在做什么。如果浮点数到整型数的转换让您感到惊讶,那么您需要更仔细地考虑。

事实上,GCC有一个选项-Wconversion,它将突出这样的案例。它在默认情况下是不启用的,也不是-Wall-Wextra的一部分(大概是因为大多数程序员都很好地理解和“预期”了这种行为),但是如果您需要的话,这个选项就在那里。

除了它不会给出警告之外,在本例中,因为您的代码包含显式的强制转换(int),所以编译器假定您是故意这样做的。

这会给出一个警告(使用-Wconversion):

代码语言:javascript
运行
复制
int i = f;

这不会:

代码语言:javascript
运行
复制
int i = (int)f;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19974285

复制
相关文章

相似问题

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