您如何使用 clang 的新自定义大小 int 功能?

xil*_*pex 2 c c++ integer clang extint

最近,我听说 clang 有了一个新功能,_ExtInt. 我知道它可以让你指定一个整数的大小(奇数或什至像 13 位整数),但你如何使用它?

xil*_*pex 5

_ExtInt将用作普通说明符。例如:

_ExtInt(13) foo;
Run Code Online (Sandbox Code Playgroud)

在这里,您将 foo 声明为 13 位。请记住不要在它之前放置shortorlong类型的关键字(因为它实际上没有意义),尽管您可以放置signedor unsigned(signed是默认值)。请注意,您不能做这样的事情;_ExtInt(5) + _ExtInt(6). 根据这个网站,这是因为:

WG14 论文建议将整数提升到最大的类型(即,添加一个 _ExtInt(5) 和一个 _ExtInt(6) 将导致一个 _ExtInt(6)),但是实现不允许这样做和 _ExtInt(5) + _ExtInt(6) 会导致编译器错误。这样做是为了在 WG14 更改论文设计的情况下,我们将能够在不破坏现有程序的情况下实施它。

这可以通过使用强制转换来解决:

(_ExtInt(6))AnExtInt5 + AnExtInt6 or static_cast<ExtInt(6)>(AnExtInt5) + AnExtInt6
Run Code Online (Sandbox Code Playgroud)

不仅如此,如果你使用 C++,你可以做一些非常疯狂的事情:

template<size_t WidthA, size_t WidthB>
  _ExtInt(WidthA + WidthB) lossless_mul(_ExtInt(WidthA) a, _ExtInt(WidthB) b) {
  return static_cast<_ExtInt(WidthA + WidthB)>(a) 
       * static_cast<_ExtInt(WidthA + WidthB)>(b);
} 
Run Code Online (Sandbox Code Playgroud)

查看此处了解更多详细信息。

额外说明

  • 一个int添加到_ExtInt(32)将是一个int。
  • 你INT大小可以上去116,777,215位。

注意:为了使用此功能,您需要最新版本的 clang,因为更改是在 2020 年 4 月 21 日进行的。