Tag: 128bit

如何知道是否定义了__uint128_t

我们可以使用预处理器来知道是否定义了unsigned long long : #include #ifndef ULLONG_MAX typedef unsigned long t_mask; #else typedef unsigned long long t_mask; #endif 但是如何知道是否定义了__uint128_t?

C中x64的128位算术运算

在x86上实现bignums时,显然数字大小的最有效选择是32位。 但是,您需要算术最多两倍的数字大小(即32 + 32 = 33,32 * 32 = 64,64 / 32 = 32)。 幸运的是,x86不仅提供了这一function,而且还可以从便携式C(uint64_t)访问它。 类似地,在x64上,希望使用64位数字。 这将需要128位算术(即64 + 64 = 65,64 * 64 = 128,128 / 64 = 64)。 幸运的是,x64提供了这个function。 不幸的是,它无法通过便携式C接入,但显然有人可以进入组装。 所以我的问题是它是否可从非便携式C访问.X64上的任何C编译器是否提供对此的访问,如果是,那么语法是什么? (注意,我不是在谈论128位向量,它们被严格地视为32或64位字的集合,它们之间没有进位传播,但是关于实际的128位整数运算。)

将二进制转换为十进制的最快方法?

我有四个无符号的32位整数,表示无符号的128位整数,以小端序排列: typedef struct { unsigned int part[4]; } bigint_t; 我想将此数字转换为十进制字符串表示forms并将其输出到文件中。 现在,我正在使用bigint_divmod10函数将数字除以10,跟踪余数。 我重复调用这个函数,输出余数作为数字,直到数字为零。 这很慢。 这是最快的方法吗? 如果是这样,有没有一种聪明的方法来实现我没有看到的这个function? 我试过看GMP的get_str.c ,但我发现它非常get_str.c 。 编辑:这是我能够为divmod10函数提出的最快的代码: static unsigned uint128_divmod10(uint128 *value) { unsigned int a = value->word[3]; unsigned int b = value->word[2]; unsigned int c = value->word[1]; unsigned int d = value->word[0]; unsigned int diva = a / 5; unsigned int divb = […]

有没有办法在gcc <4.4上做128位整数

gcc 4.4似乎是在他们添加int128_t我需要使用位移,而且我已经用完一些位字段了。 编辑 :可能是因为我在32位计算机上,没有办法让它用于32位计算机(Intel Atom),是吗? 我不在乎它是否会产生棘手的慢速机器代码,如果我按照预期的工作位移。