如何在C中实现二进制128



我开始尝试使用C实现新的数据类型,特别是浮点值。我在使用longer_int实现binary128时想出了这种方法,但我还没有完全理解。

我开始的方式是通过复制代码和修改代码来实现它。然而,代码是C++,C不支持OOP,所以我要做的是尝试翻译代码。

我找不到longer_int的C版本,因为我曾经拥有的这个问题(同一个帐户,但现在已删除(现在已被删除,我无法查看链接。

在这些C++文件的帮助下,我如何使用C实现binary128

为了避免这个问题的结束,我想知道如何在longer_int.h中翻译OOP格式。

class longer_int {
private:
char num_str[];
public:
longer_int();
longer_int(const int &num);
longer_int(const char &num[]);
longer_int(const longer_int &num);
// Sample code from it, now translated to C, but still OOP

您应该从以下内容开始:struct而不是class,忽略public/private关键字,构造函数是返回my_int128的方法。C中没有重载,所以每个不同的构造函数都必须有不同的名称。另一种学派认为,您不需要专门的构造函数,只需要能够从intchar[]my_int128复制数据的特殊方法设置器(我更喜欢这种学派(。最后我举一个榜样。

#include <stdio.h>
#include <string.h>
typedef struct 
{
char num_str[16]; /* fixed to int128 */
} my_int128;
/* Don't need this: my_int128 li = { 0 }; is enough!
my_int128 create_int128()
{
my_int128 li = { 0 };
return li;
}
*/
my_int128 create_int128_from_num(int num)
{
my_int128 li = { 0 };
/* TODO: set li with num */
return li;
}
my_int128 create_int128_from_char_array(const char num[16])
{
my_int128 li = { 0 };
memcpy(li.num_str, num, 16);
return li;
}
my_int128 create_int128_from_int128_ptr(const my_int128 *num)
{
return create_int128_from_char_array(num->num_str);
}

设定者:

void set_from_int(my_int128 *li, int num)
{
/* TODO: set li with num */
}

使用C的最佳方法是将binary128实现为结构类型

struct binary128 {
unsigned char data[16];
};

请注意,C中没有运算符重载,因此您需要将与类型的所有交互(如来自另一个类型的赋值、算术运算等(实现为函数。

关注Shawn发布的评论中的链接,查看更一般的情况:任意宽度整数的实现。

我假设你有一些C++对象代码,你想用纯C重写它。一旦你认为最初的C++编译器只是生成C代码的预处理器,那就不应该太难了。

首先是注意事项:

  • C没有提供封装:函数只能具有翻译单元可见性或全局可见性
  • C没有提供函数重写。一个函数只能有一组参数:使用不同的名称

也就是说,要翻译C++类,需要构建一个C结构来容纳数据成员,并用普通函数替换方法。对于最后一部分,您只需将隐藏的this替换为显式指针作为附加参数。

最新更新