【发布时间】:2021-05-15 13:48:17
【问题描述】:
我需要在我的代码中使用 128 位 unsigned int 变量。
在网上搜索我读到了unsigned __int128。
这里https://gcc.gnu.org/onlinedocs/gcc/_005f_005fint128.html我读了
类型 __int128 支持具有足够宽以容纳 128 位的整数模式的目标
我的第一个问题是 target 是什么意思?我要检查一下我的电脑是否可以表达这种类型?
第二个问题是如何打印这种变量?
最后我需要做些什么来使用这种变量吗?上面相同的链接说
对于有符号的 128 位整数,只需写 __int128,对于无符号的 128 位整数,只需写无符号的 __int128。
所以看来我不需要#include 任何东西,甚至在编译过程中我什至没有在gcc 中添加一些选项,对吗?
【问题讨论】:
-
"Target" 是您正在为其编写代码的目标架构。你是只为你的电脑写的吗?
-
据我所知,
printf和朋友不支持打印。您必须自己编写或找到第三方实现。见stackoverflow.com/questions/25114597/how-to-print-int128-in-g -
感谢您的回答; Eugene Sh 所以这意味着如果我的电脑是 32 位或 64 位机器,对吗?如果是这种情况,有一个 64 位 pc 的整数模式足够宽以容纳 128 位?
-
gcc[andclang] (例如)将在 32 位系统上生成代码,允许long long[64 位] 仅使用 32 位算术工作。在 64 位机器上,它们使用本机 64 算术(因为硬件支持它)。同样,它们使用 64 位指令生成 128 位数学代码。它内置在编译器中。 -
编译器可以生成必要的 32 位指令,以在 32 位硬件架构上执行 128 位数学运算。但是,他们选择不这样做。要使用 32 位指令 -> 64 位数学或 64 位 insts -> 128 位数学,请考虑乘法:对于 32 -> 64,它需要 3 次乘法和两次加法。 64 -> 128 大致相同。因此,32 -> 128 可能需要 6 次乘法和 4 次加法 [or worse]。因此,他们认为代码过于繁琐。由于大多数现代/典型系统在 H/W 中都有 64 位,因此他们决定将 128 位 impl 限制在这些系统中。
标签: c variables gcc unsigned int128