c++ - 您如何使用 clang 的新自定义大小 int 功能?
问题描述
最近,听说 clang 有了一个新功能,_ExtInt
. 我知道它可以让你指定一个整数的大小(奇数甚至像 13 位整数),但是你如何使用它呢?
解决方案
_ExtInt
将用作普通说明符。例如:
_ExtInt(13) foo;
在这里,您声明 foo 为 13 位。记住不要在它前面放short
orlong
类型的关键字(因为它没有真正意义),尽管你可以放signed
or 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 日进行的。
推荐阅读
- chromium - 是否可以自动允许在铬中使用麦克风
- google-apps-script - 清单中的 DataStudio 设置被删除
- jsf - var 'FileUpload' 的小部件不可用
- javascript - 调用同步请求时 JS/CSS 不起作用
- oracle - 使用 R2dbc 过滤查询
- python - 商店商品的分类
- javascript - react hooks的常见场景:如何改变hook依赖而不导致无限渲染
- swift - 泛型和返回专用泛型实例的方法
- php - Kuberneties / ingress - 使用 apache 处理 js 文件时出错
- javascript - 为什么我尝试上传图片时出现错误