首页 > 解决方案 > 您如何使用 clang 的新自定义大小 int 功能?

问题描述

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

标签: c++cintegerclangextint

解决方案


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

_ExtInt(13) foo;

在这里,您声明 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

不仅如此,如果你使用 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);
} 

在这里查看更多细节。

额外说明

  • int添加到 an将_ExtInt(32)是一个 int。
  • 您的 int 大小可以达到1位数16,777,215

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


推荐阅读