gpt4 book ai didi

c++ - 如何在 C++ 中设计 16,32, 64 字节甚至更大的 INT

转载 作者:行者123 更新时间:2023-11-28 01:17:21 24 4
gpt4 key购买 nike

作为初学者,我知道如果需要我们可以使用 ARRAY 来存储更大的数字,但我想要一个 16 字节 INT c++ 中的数据类型,我可以在其上执行所有算术运算,就像在 INTFLOAT

等基本数据类型上执行的一样

那么我们实际上可以根据需要增加默认数据类型的大小,例如 64 字节的 int 或 120 字节的 double,不是直接在基本数据类型上而是在效果与增加数据类型的容量相同。

这甚至可能吗?如果是,那么如何实现,如果不是,那么实现相同目标的完全不同的方法是什么?

最佳答案

是的,这是可能的,但不,这不是微不足道的。

首先,我觉得有必要指出,在这一领域,C 和 C++ 确实无法提供您真正喜欢的最低级别的硬件访问权限。在汇编语言中,您通常会获得一些使多精度算术更容易实现的特性。一个是进位标志。这跟踪先前的加法是否产生了进位(或先前的减法产生了借位)。因此,要在具有 64 位寄存器的机器上添加两个 12 位数字,您通常会按照以下一般顺序编写代码:

; r0 contains the bottom 64-bits of the first operand
; r1 contains the upper 64 bits of the first operand
; r2 contains the lower 64 bits of the second operand
; r3 contains the upper 64 bits of the second operand
add r0, r2
adc r1, r3

同样,当您将两个数字相乘时,大多数处理器会在两个单独的寄存器中生成完整的答案,因此当(例如)您将两个 64 位数字相乘时,您会得到 128 位的结果。

然而,在 C 和 C++ 中,我们不明白这一点。解决它的一种简单方法是分小块工作。例如,如果我们想要在提供 64 位 long long 作为其最大整数类型的实现上使用 128 位类型,我们可以在 32 位 block 中工作。当我们要进行操作时,我们将它们扩展为 long long,然后对 long long 进行操作。这样,当我们将两个 32 位 block 相加或相乘时,如果结果大于 32 位,我们仍然可以将其全部存储在我们的 64 位 long long 中。

因此,加法生活非常简单。我们添加两个最低阶的词。我们使用位掩码获取低 32 位并将它们存储到结果的低 32 位中。然后我们取高 32 位,并在添加操作数的下 32 位时将它们用作“进位”。继续,直到我们将所有 128(或其他)操作数位相加并获得总体结果。

减法非常相似。事实上,我们可以对第二个操作数进行 2 的补码,然后相加得到我们的结果。

乘法变得有点棘手。我们如何在更小的部分进行乘法并不总是很明显。通常是基于分配属性。也就是说,我们可以取一些大数 A 和 B,并将它们分解为 (a0 + a1) 和 (b0 + b1),其中每个 an 和 bn 都是操作数的 32 位 block 。然后我们使用分配属性将其转换为:

a0 * b0 + a0 * b1 + a1 * b0 + a1 * b1

这可以扩展到任意数量的“ block ”,但如果您处理的是非常大的数字,则有更好的方法(例如,karatsuba)。

关于c++ - 如何在 C++ 中设计 16,32, 64 字节甚至更大的 INT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58241422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com