【问题标题】:create your own my128int data type with the help of inbuilt c data type借助内置的 c 数据类型创建自己的 my128int 数据类型
【发布时间】:2015-02-20 15:26:23
【问题描述】:

我想创建自己的数据类型,它可以保存从-2^1272^127-1 的值,并希望对两个my128int 数据类型变量执行加法。 我在stackoverflow社区上搜索,发现custom data type in C

上面讨论的线程需要什么额外的任务。

void addition(my128int a, my128int b)
{
    ....
    //perform some task
    // print the result a+b
}

【问题讨论】:

  • 这只能使 my128int 成为字符串并手动执行算术运算 AFAIK。
  • 你的问题对我来说有点宽泛。您的函数签名看起来不错,但这取决于您如何定义my128int
  • 如何限制数据范围?
  • @Cocoop 是的,我在声明 my128int 数据类型时面临的问题完全相同。该怎么做?
  • @iharob 这几乎是真的,但是需要一个字符串(即文本表示)有点过分了。

标签: c


【解决方案1】:

对于整数数据类型,我不太关心您引用的问题的(未接受的)答案中提供的解决方案。

我自己,我会实现一个你这样描述的类型:

typedef struct myint128_s {
    uint32_t bits[4];
} myint128;

加法将如下所示:

void myint128_add(myint128 *addend1, myint128 *addend2, myint128 *sum) {
    uint32_t carry = 0;
    int i;

    for (i = 0; i < 4; i += 1) {
        uint64_t temp = (uint64_t) addend1->bits[i]
                + (uint64_t) addend2->bits[i] + carry;
        sum->bits[i] = (uint32_t) temp;
        carry = (uint32_t) (temp >> 32);
    }

    /* can detect overflow here, if desired */
}

这假设 / 提供负数的二进制补码表示,与您为可表示数字指定的边界一致。然后,您不必特别注意符号位(位 [3] 的第 63 位)。

实际上,这是以 2^32 为底的数字表示。

【讨论】:

  • 这在 64 位架构上效率低下
  • @LưuVĩnhPhúc,64 位机器非常有效地执行 32 位算术。尽管如此,您仍可以将 bignum 数字实现为类型 uint64_t,但这使得正确处理进位变得不那么简单(在 C 中,而不是在汇编中)。我不相信这会是一场净赢。
  • 不,你的方法太复杂了。通过比较较低加法的结果与其中一个操作数,可以轻松设置进位。现代编译器会认识到这一点并变成一对 add/adc。你可以看到汇编输出here。可能你还没有看到关于多词添加的任何问题stackoverflow.com/questions/27261291/…
  • 64 位机器确实可以高效地进行 32 位运算,但是进行 32 位运算会导致所需的运算次数增加一倍,并且总时间会增加。要添加 128 位值,您只需要在 x86_64 上使用 add rax, rcx; adc rbx, rdx,但在 x86 上至少需要 4 条指令以及大量内存引用
  • @LưuVĩnhPhúc,是的,你的方法比我的更有效(尽管我仍然反对将我的方法标记为“inefficient”)。但是乘法呢?你需要一个完整的(大)数字进位,我认为当你的数字已经是寄存器的大小时你不会轻易得到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多