首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gcc用long代替__int128实例化模板

gcc用long代替__int128实例化模板
EN

Stack Overflow用户
提问于 2015-11-06 16:42:11
回答 1查看 190关注 0票数 3

我迷迷糊糊的。在第二次调用我的big模板时,这里发生了什么?

代码语言:javascript
复制
template <class T> void big(T t) {  }

int main()
{
    big(9223372036854775808);                        // calls big<__int128>
    big(941832094813209483120);                      // calls big<long>
    big(239120938091238093219203810293801923832019); // calls big<__int128>
}

为什么长模板941832094813209483120实例化,而其他两个值则得到__int128模板

这个值显然不适合不适合long,似乎会导致溢出(请参阅下面完整的gdb会话):

代码语言:javascript
复制
big<long> (t=1048147054022350704) at blob.cpp:1

我使用gcc-5.2.0gcc-4.9.2观察到这一点,同时使用gdb-7.7.1进行调试。

这是我的完整gdb会话:

代码语言:javascript
复制
Breakpoint 1, main () at blob.cpp:5
(gdb) s 
big<__int128> (t=0x00000000000000008000000000000000) at blob.cpp:1
(gdb)  
main () at blob.cpp:6
(gdb)  
big<long> (t=1048147054022350704) at blob.cpp:1
(gdb)  
main () at blob.cpp:7
(gdb)  
big<__int128> (t=0x0000000000000000d90567828f8ae8d3) at blob.cpp:1
(gdb)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-06 18:42:02

由于OP已经确认长在他们的系统上是64位,我们可以看到gcc处理128位整数说:

GCC不支持对长整数小于128位的目标表示__int128型整数常数。

因此,虽然我同意这种行为是奇怪的,但从技术上讲,这并不是一个bug,因为gcc不支持这个场景,并明确地记录了这一点。

编译器可以支持C++11标准草案3.9.1节中的扩展签名整数:

也可能有实现定义的扩展有符号整数类型。

但它们是在2.14.2节中对整数字的实现定义和措辞规定的:

如果一个整数文本不能用其列表中的任何类型表示,并且扩展的整数类型(3.9.1)可以表示它的值,则可以具有该扩展整数类型.

以五月为重点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33571554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档