如何确定宽度是"int"和"unsigned"两倍的整数类型?

chu*_*ica 5 c int portability

中间乘法的值通常需要两倍的位数作为输入.

 // Example
int foo(int a, int b, int carry, int rem) {
  int2x c;  // Some type that is twice as wide at `int`
  c = (int2x)a * b + carry;
  return (int) (c % rem);
}
Run Code Online (Sandbox Code Playgroud)

考虑到填充的可能性(似乎限制了sizeof()有用性)和非2的补码整数(限制位误),......

以下是否始终创建所需类型?
如果没有,如何编码至少一个合理的解决方案,即使不完全可移植?


#include <limits.h>
#include <stdint.h>

#if LONG_MAX/2/INT_MAX - 2 == INT_MAX
  typedef long int2x;
  typedef unsigned long unsigned2x;
#elif LLONG_MAX/2/INT_MAX - 2 == INT_MAX
  typedef long long int2x;
  typedef unsigned long long unsigned2x;
#elif INTMAX_MAX/2/INT_MAX - 2 == INT_MAX
  typedef intmax_t int2x;
  typedef uintmax_t unsigned2x;
#else
  #error int2x/unsigned2x not available
#endif
Run Code Online (Sandbox Code Playgroud)

[编辑]
资格:"永远",如果long,long longintmax_t,不工作,它是可以的#error.
我想知道的是,如果至少1 long,long longintmax_t将工作,将int2x被输入正确?

注意:以上假设xxx_MAX是2的奇数幂减1.可能是一个很好的假设?以上工作至少有2个平台,但这不是一个很好的可移植性测试.

R..*_*R.. 5

所有 *_MAX 常量都具有以下形式的假设(2^n)-1是有效的。参见6.2.6 类型表示,尤其是6.2.6.2 整数类型,其中无符号整数类型的表示和有符号整数类型的正值完全定义为纯二进制,因此产生的最大值小于 1 的幂二。