简短的问题:如果我这样做:
double x = 3.152;
int y = (int) x;
y
应存储值 3
。 gcc
是否调用执行该转换的函数?如果是这样,它位于何处,我如何编写自己的并指向 gcc
以使用它?
带有背景信息的长问题:
我正在编写一个OS,并且正在重写C
标准库,作为个人学习项目。结果,我在编译 C 代码时禁用了很多东西。具体来说,我使用标志:
-nostartfiles -nostdlib -nostdinc -fno-builtin -fno-stack-protector -nodefaultlibs
我一直很幸运地使用整数,但我现在开始使用 double ,并尝试将 double 转换为整数。最终发生的事情是一无所有。所以我怀疑在我禁用的所有这些东西中的某个地方是实际执行转换的代码。我很高兴重写它,因为这对我来说是一个有趣的学习,但我不知道我应该重写什么。
请您参考如下方法:
我使用 -S 选项编译了您的代码以提供汇编器并查看了它。诚然,我在 OS X 上使用 Clang,但我认为 gcc 会做同样的事情。它所做的是使用 cvttsd2si在一条机器语言指令中将 double float 转换为带符号整数的指令。
这是特定于 x86_64 架构的。如果目标体系结构中没有等效指令,编译器将插入对执行转换的内置函数的调用。
如果您的程序编译和链接(没有任何库或内置插件)没有任何问题,那么您的代码可能使用了一条指令,否则我会期望链接错误,但您需要确保编译器是没有优化您的代码,因此它不需要进行转换。例如
int main()
{
double y = 3.14159;
int x = (int) y;
return 0;
}
可以很容易地优化为只执行 return 0
位。