在C++中表示128位数的最佳方法是什么?它应该尽可能地与内置数值类型一致(即支持所有算术运算符等).
我正在考虑构建一个具有2个64位或4个32位数的类.或者可能只是创建一个128位的内存块并自己完成所有操作.
是否有一些更容易/更标准的方式,或者我自己实施它时不太可能搞砸的东西?:)
如果它可以扩展到256位,512位等等也会很好...
有PRIu128,其行为类似于PRIu64来自<inttypes.h>:
printf("%" PRIu64 "\n", some_uint64_value);
Run Code Online (Sandbox Code Playgroud)
或者手动逐位转换:
int print_uint128(uint128_t n) {
if (n == 0) return printf("0\n");
char str[40] = {0}; // log10(1 << 128) + '\0'
char *s = str + sizeof(str) - 1; // start at the end
while (n != 0) {
if (s == str) return -1; // never happens
*--s = "0123456789"[n % 10]; // save last digit
n /= 10; // drop it
}
return printf("%s\n", s);
}
Run Code Online (Sandbox Code Playgroud)
是唯一的选择吗? …
我想要一个128位整数,因为我想存储两个64位数的乘法结果.在gcc 4.4及以上版本中有没有这样的东西?
作为扩展,整数标量类型
__int128支持具有足够容纳128位的整数模式的目标.只需写入__int128带符号的128位整数,或写入unsigned __int128无符号的128位整数.GCC中不支持表示
__int128长整数小于128位宽的目标的类型的整数常量.
我想知道什么gcc版本增加了对这种类型的支持,或者如果有,可以直接用来测试其存在的宏.
我们可以使用预处理器来知道是否unsigned long long定义了:
#include <limits.h>
#ifndef ULLONG_MAX
typedef unsigned long t_mask;
#else
typedef unsigned long long t_mask;
#endif
Run Code Online (Sandbox Code Playgroud)
但是如何知道如何__uint128_t定义?
Windows上是否有任何c编译器本身可以使用128位整数?例如,您可以在linux上使用gcc,使用__uint128_t ...在Windows上有任何其他机会吗?(如果128位计算机也能在32位计算机上运行,那就太好了!:D)
马特奥
我正在尝试实现BigInt并阅读了一些关于它的线程和文章,其中大多数建议使用更高的基数(256或2 ^ 32甚至2 ^ 64).
为什么更高的基数有利于此目的?
我有的其他问题是我应该如何将字符串转换为更高的基数(> 16).我读过没有标准的方法,除了base64.最后一个问题,我如何使用这些更高的基础.一些例子会很棒.