我迷迷糊糊的。在第二次调用我的big模板时,这里发生了什么?
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会话):
big<long> (t=1048147054022350704) at blob.cpp:1我使用gcc-5.2.0和gcc-4.9.2观察到这一点,同时使用gdb-7.7.1进行调试。
这是我的完整gdb会话:
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)发布于 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)可以表示它的值,则可以具有该扩展整数类型.
以五月为重点。
https://stackoverflow.com/questions/33571554
复制相似问题