2

看到这样的作品有点惊讶:

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同时给出的答案:是的,它可能认为像“圆形”这样的功能是可靠的。但不是直接 WRT 到预期的数据/信息的完整性。

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

4

4 回答 4

3

这正是

(int)f

这表明程序员知道他在做什么,而在大多数编程语言中都禁止默默地切断小数部分并将其余部分存储在整数中。

顺便说一句,不只是小数部分被切断。浮点数也可以有一个大到不能表示为 int 的值。考虑:

(int) 1e20f
于 2013-11-14T10:34:52.623 回答
2

该声明int i = (int)f;明确表示“请拿走我的花车f并将其制成int”。这当然是我经常发现的一件有用的事情——你为什么不希望能够将浮点值从某种计算转换为整数?演员表(int)将告诉编译器“我真的希望这是一个整数”,就像在 C 中你可以做的那样char *p = (char *)1234567;- 有一个类型转换告诉编译器“我真的知道我在做什么”。

如果您这样做,int i = f;或者int i = 10.25;编译器仍会执行您“要求”的操作 - 将浮点值转换为整数。如果您启用适当的警告,它可能会发出警告说“您正在将 a 转换float为”。int

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

这有点像开车,后面有墙的时候倒车,踩油门,很可能会导致汽车撞墙——如果这不是你想要的,那么“不要去做”。

于 2013-11-14T10:36:21.200 回答
1

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

你是否愿意这样做取决于你。一般来说,C/C++ 语言旨在为程序员提供大量低级功能,这意味着程序员需要知道他们在做什么。如果浮点到整数的转换让您感到惊讶,那么您需要更加努力地思考。

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

除了它不会发出警告,在这种情况下,因为您的代码包含显式强制转换(int),所以编译器假定您是故意这样做的。

这会发出警告(带-Wconversion):

int i = f;

这不会:

int i = (int)f;
于 2013-11-14T10:33:23.357 回答
1

在处理复杂数据但最终需要将此数据转换为 int 以对其进行处理的情况下,转换为整数很有用。想想数组中的偏移量,或屏幕上的像素

想想在屏幕上画一个圆圈。不存在像素的一小部分(因此坐标是整数),但您不能仅使用整数计算像素的坐标(正弦适用于 pi 和其他浮点数)。

于 2013-11-14T11:33:20.657 回答