什么是在C代码中执行转换,在Linux上使用gcc编译?

时间:2017-03-03 14:08:43

标签: c gcc casting

简短问题:如果我这样做:

double x = 3.152;
int y = (int) x;

y应存储值3gcc是否会调用执行该转换的函数?如果是,它位于何处,我如何编写自己的并指向gcc以使用它?

有关背景信息的长问题:

我正在编写操作系统,并重新编写C标准库,作为个人学习项目。结果,我在编译C代码时禁用了很多东西。具体来说,我使用标志:

  

-nostartfiles -nostdlib -nostdinc -fno-builtin -fno-stack-protector -nodefaultlibs

我一直很好运与int一起工作,但我现在正在继续使用双打,并且试图将双精度投入到int中。最终发生的事情是无足轻重的。所以我怀疑在我所禁用的所有事情中的某个地方是实际执行演员表的代码。我很高兴重写它,因为这对我来说很有趣,但我不知道我应该重写什么

4 个答案:

答案 0 :(得分:2)

我使用-S选项编译代码以给出汇编程序并查看它。不可否认,我在OS X上使用Clang,但我认为gcc会做同样的事情。它所做的是使用cvttsd2si指令将一个双精度浮点数转换为一个机器语言指令中的有符号整数。

这是x86_64架构特有的。如果目标体系结构中没有等效指令,则编译器将插入对执行转换的内置函数的调用。

如果您的程序编译和链接(没有任何库或内置命令)没有任何问题,那么您的代码可能使用单个指令,否则我会期望链接错误,但您确实需要确保编译器是没有优化您的代码,因此它不需要进行转换。例如

 int main()
 {
     double y = 3.14159;
     int x = (int) y;
     return 0;
 }

可以很容易地进行优化,只需执行return 0位。

答案 1 :(得分:2)

它是语言的一部分,就像添加两个数字一样,编译器必须知道如何执行此操作然后将其应用于目标(以便完全支持该语言)。它可能会也可能不会调用函数,具体取决于目标支持的内容,如果目标中没有浮点硬件,则确定它必须调用软库来执行double to int转换。有时为什么硬浮点不能做某些事情和/或编译器实现和设计原因他们仍然可以选择调用函数来执行double到int,即使有一个硬FPU。

如果使用这些库有时称为编译器库,则在gcclib或gcc库类别中使用gcc。通常不是你看到的东西(隐藏在幕后)......它不仅限于浮点,你会看到类似的库调用加法,减法,乘法,除法,以及浮点数,C语言支持的操作目标不一定直接支持。 (在32位处理器上添加两个64位整数,在没有硬件除法的处理器上添加整数除法,在仅支持无符号乘法的处理器上添加有符号乘法等)。

这个问题没有一个答案,它因编译器,编译器版本和目标而异。

修改

就编写操作系统而言,它隐藏在编译器中,您不应该在操作系统级别接触它。编译器必须完成为目标生成工作代码的工作(你的操作系统是目标的一部分,但是......),它在一天结束时是很多机器代码,其中一些是直接的机器代码执行double to int或链接的gcc库,其中包含执行此操作的机器代码。所以你的操作系统应该不在乎。现在说有时软件的实现有例如除以零,并希望对可能是C库调用的那个进行一些操作,这可能会成为系统调用。硬件实现直接划分float或int,可能有一个操作系统在这种情况下可能必须支持的中断。所以那里有可能的联系。 IEEE-754浮点数确实有,或者至少是我最近一次读它的时候,有软件/操作系统挂钩,这里再次除以零被捕获与除以零可能有不同的结果。对于float to int操作的情况,有一种情况是NaN被转换为int并且不知道针对trapped vs no trapped的规范答案,但是如果你的编译器正在生成软浮点函数,那么它可能会拖入它假设的其他一些调用正受到其他gcc库和/或C标准库的支持,然后可能会连接到操作系统中的某些内容。

答案 2 :(得分:1)

不,它没有(必须)调用一个函数。它只是"知道" (由于是特定目标处理器的编译器)为了进行转换而发出哪些指令。

当然 可以选择将其作为对某个子程序的调用来实现,如果它有很多工作,但在典型的x86处理器上它是单个指令所以它只是发出那个。

您应该检查您获得的代码,最可能的原因(对于像问题中的代码那样,使用简单的常量表达式进行编译)是在运行时根本没有执行转换。

答案 3 :(得分:1)

是的,它会调用函数或可能是内联代码。

将浮点类型转换为整数的要求非常普遍,因此可能会有一个特殊的机器语言指令。您无法从C访问它。您可以做的是查看浮点数的位模式,提取指数,符号和尾数,然后通过将尾数移动正确的数量来进行转换,您还可以必须添加一个前导1.

在没有专用FPU的机器上,该演员如何运作。