GCC 如何理解复杂的算术?

How GCC understand complex arithmetics?

我对 C 语言有点陌生,我对 C 的一些基本原理有疑问。我正在实现一个处理定点运算的自定义复杂库。

我们可以在 C 中使用名为 complex.h 的库。使用该库,我们可以如下声明和初始化复杂变量。

complex float a = 2 + 3I;
complex float b = 5 + 2I;

complex float c = a + b;

但是当我们添加这两个复数浮点数时,编译器如何理解我们要添加两个复数。编译器是否使用其数据类型理解它?

那么我们需要遵循什么方法来实现复杂的数据类型?

我已经知道如何使用结构来实现它。但是我需要知道如何制作该结构来处理以 a + bI.

格式给出的变量

更清楚地说,我的问题是我如何处理结构中的 'I' 字符?

编译器知道如何处理对 complex 类型执行算术运算。然后,您可以使用函数 crealfcimagf(或 crealcimag for complex double)来获取每个部分。

complex float a = 2 + 3I; complex float b = 5 + 2I;
complex float c = a + b;

printf("result: %f%+fi\n", crealf(c), cimagf(c));

输出:

7.000000+5.000000i

在 C 中,复杂类型内置于语言本身。包括 <complex.h> 只是让您使用 complex 这个词来处理它们;如果没有 header,您必须将其拼写为 _Complex1 复杂类型内置于语言中,因此编译器对它们有先天的了解。您不能自己创建类似的类型。

在 C++ 中(问题最初被标记为),<complex> 中的 std::complex 是 class。 + 和其他一些操作员使用它,因为它们是 overloaded。这并没有什么神奇之处,您可以制作自己的 classes 以这种方式运行。与 C++ 不同,C 没有运算符重载,因此在 C 中是不可能的。


1 这样做是为了保持与将单词 complex 用于其他目的的程序的向后兼容性。以 _ 开头后跟大写字母的单词是 保留的 ,因此在引入复数之前,程序出于任何目的使用单词 _Complex 都是非法的进入语言。