我感到茫然和困惑。第二次打电话给我的big
模板时发生了什么?gcc实例化模板与长而不是__int128
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)
假设long long在你的平台上不是128bit,那么[gcc docs say](https://gcc.gnu.org/onlinedocs/gcc/_005f_005fint128.html)* GCC中不支持表示整数常量对于长整型长度小于128位的目标,__int128类型*所以我认为这在技术上不是bug,因为它不被支持。 –
@ShafikYaghmour:在我的平台上,“long”和“long long”都是“64bit”宽。所以我明白,我可以**不**依赖于我的任何我的整数常量上面工作!非常感谢您澄清。 –
我同意这是奇怪的行为,但由于它是不受支持的,它似乎相当于说它是未定义的行为,因此你可以指望鼻子恶魔等等。 –