【问题标题】:use of 128 bit unsigned int in c language [duplicate]在c语言中使用128位无符号整数[重复]
【发布时间】: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 [and clang] (例如)将在 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


【解决方案1】:
  1. “目标”是指您的编译器配置为为其创建程序的 CPU 体系结构和操作系统的特定组合。 Does a list of all known target triplets in use exist? 有一个讨论。但是“整数模式”实际上是编译器内部使用的一个概念,只是间接地与硬件能做什么和不能做什么有关。所以这一切真正说明的是“编译器在某些目标上支持 128 位整数,而在其他目标上不支持”。找出你是否这样做的最简单方法是尝试编译并运行一个使用 __int128 的小型测试程序。

  2. 大多数系统的printf 函数不支持__int128,所以你必须自己编写代码来打印它们,或者在某个地方找到第三方代码。请参阅How to print __int128 in g++?,它适用于 C++,但仍然相关。

  3. 您无需包含任何内容或使用任何特殊选项。

【讨论】:

  • 谢谢,很清楚
猜你喜欢
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
  • 2020-07-06
  • 2011-11-09
  • 2017-09-06
  • 1970-01-01
  • 2019-03-26
  • 2012-01-15
相关资源
最近更新 更多