CLang14中_ExtInt大位宽失效,关于原生大整数及_BitInt的疑问
Clang 14 自定义位宽整数相关问题解答
问题背景
Clang 14发布后,原Clang 13中可正常编译的代码无法运行:
int main() { using T = _ExtInt(256); }
此前_ExtInt可创建任意位长的固定大小整数,甚至像_ExtInt(12345)这类特殊位长也能正常工作。
在Clang 14中,_ExtInt仅支持128位:
int main() { using T = _ExtInt(128); }
这段代码在Clang 13和14中都能运行,但会提示_ExtInt()已废弃,建议改用_BitInt(128)。
虽然存在unsigned __int128,但_ExtInt()/_BitInt()支持创建任意位长的整数,包括素数位长的_ExtInt(97)或_BitInt(97)。
问题解答
1. Clang 14是否仍原生支持超过128位的整数?
可以,但需使用_BitInt而非已废弃的_ExtInt。Clang 14中_ExtInt被限制为仅支持128位,目的是引导用户迁移到标准提案中的_BitInt语法。使用_BitInt(x)(x>128)可原生创建超过128位的自定义位宽整数,功能与Clang 13中的_ExtInt(x)一致,无需依赖Boost等外部库。
2. Clang 14中_BitInt(x)与_ExtInt(x)是否完全等效?
对于两者均支持的位宽(如128位及以下),功能是等效的,但_ExtInt已被标记为废弃。_BitInt是C23标准引入的自定义位宽整数语法,Clang 14将其作为推荐替代方案,而_ExtInt仅保留128位的兼容性支持,后续版本可能完全移除_ExtInt。需注意:当x>128时,_ExtInt(x)在Clang 14中无法编译,但_BitInt(x)可正常使用。
内容的提问来源于stack exchange,提问作者Arty
相关产品推荐
相关产品推荐

