Tag: int128

如何正确添加/减去128位数字(如两个u_int64_t)

我在C中工作,需要添加和减去64位数字和128位数字。 结果将保存在128位数字中。 我使用整数数组来存储128位数的上半部和下半部(即u_int64_t bigNum[2] ,其中bigNum[0]是最不重要的)。 任何人都可以帮助添加和减法函数,可以接受bigNum并添加/减去u_int64_t吗? 我在网上看到了很多不正确的例子,所以请考虑一下: bigNum[0] = 0; bigNum[1] = 1; subtract(&bigNum, 1); 此时bigNum[0]应该设置所有位,而bigNum[1]应该没有设置位。

Clang中有__int128_t的错误?

这个小代码汇编了GCC和Clang,但给出了不同的结果: #include int main(){ __int128_t test=10; while(test>0){ int myTest=(int)test; printf(“? %d\n”, myTest); test–; } } 对于GCC,这从预期行为从10减少到1,而对于Clang,它继续计入负数。 对于Clang,如果我用test-=1替换test–那么它也会给出预期的行为。 __int128_t是GCC扩展,因此上述结果仅适用于非标准C,因此在Clang中__int128_t可能“使用后果自负”。 这是Clang中的一个错误,还是我犯了一些我没看到的错误? 编辑:我正在使用gcc(MacPorts gcc48 4.8-20130411_0)4.8.1 20130411(预发布)和Apple clang 4.0版(标签/ Apple / clang-421.0.60)(基于LLVM 3.1svn)。

支持英特尔C编译器中的+, – ,*,/和%的128位整数?

GCC和Clang具有__int128_t和__uint128_t扩展,用于128位整数运算。 我希望 __m128i可以为英特尔C编译器提供类似的东西,但是(如果它甚至可能)它看起来像我必须编写显式SSE2函数调用才能使用__m128i ,而不是使用“内置” “ + , – , * , /和%等运营商。 我希望做这样的事情(这不起作用): #if defined(__INTEL_COMPILER) && defined(__SSE2__) #include “xmmintrin.h” typedef __u128 uint128_t; #elif defined (__GNUC__) typedef __uint128_t uint128_t; #else #error For 128-bit arithmetic we need GCC or ICC, or uint128_t #endif 是否有128位整数支持运算符+ , – , * , /和%埋藏在icc中?

将两个64位整数乘以128位然后>>到64位的最快方法?

我需要将两个带符号的64位整数a和b相乘,然后将(128位)结果移位到带符号的64位整数。 最快的方法是什么? 我的64位整数实际上代表fmt小数位的定点数。 选择fmt使得a * b >> fmt不应该溢出,例如abs(a) < 64<<fmt和abs(b) < 2<<fmt , fmt==56将永远不会溢出64位作为最终结果将是< 128<<fmt ,因此适合int64。 我想这样做的原因是快速准确地评估forms的五次多项式((((c5*x + c4)*x + c3)*x + c2)*x + c1)*x + c0在不动点格式,每个数字都是带有fmt小数位的带符号的64位定点数。 我正在寻找实现这一目标的最有效方法。