在C/C++中,64为整型一直是一种没有肯定规范的数据类型。现今主流的编译器中,对64为整型的支持也是标准不一,形态万千。通常来讲,64位整型的定义方式有long long和__int64两种(VC还支持_int64),而输出到标准输出方式有printf("%lld",a),printf("%I64d",a),和cout << a三种方式。linux
本文讨论的是五种经常使用的C/C++编译器对64位整型的支持,这五种编译器分别是gcc(mingw32),g++(mingw32),gcc(linux i386),g++(linux i386),Microsoft Visual C++ 6.0。惋惜的是,没有一种定义和输出方式组合,同时兼容这五种编译器。为完全弄清不一样编译器对64位整型,我写了程序对它们进行了评测,结果以下表。函数
变量定义 | 输出方式 | gcc(mingw32) | g++(mingw32) | gcc(linux i386) | g++(linux i386) | MicrosoftVisual C++ 6.0 |
---|---|---|---|---|---|---|
long long | "%lld" | 错误 | 错误 | 正确 | 正确 | 没法编译 |
long long | "%I64d" | 正确 | 正确 | 错误 | 错误 | 没法编译 |
int64 | "lld" | 错误 | 错误 | 没法编译 | 没法编译 | 错误 |
int64 | "%I64d" | 正确 | 正确 | 没法编译 | 没法编译 | 正确 |
long long | cout | 非C++ | 正确 | 非C++ | 正确 | 没法编译 |
__int64 | cout | 非C++ | 正确 | 非C++ | 没法编译 | 没法编译 |
long long | printint64() | 正确 | 正确 | 正确 | 正确 | 没法编译 |
上表中,正确指编译经过,运行彻底正确;错误指编译虽然经过,但运行结果有误;没法编译指编译器根本不能编译完成。观察上表,咱们能够发现如下几点:post
表中最后一行输出方式中的printint64()是我本身写的一个函数,能够看出,它的兼容性要好于其余全部的输出方式,它是一段这样的代码:spa
void printint64(long long a) { if (a<=100000000) printf("%d\n",a); else { printf("%d",a/100000000); printf("%08d\n",a%100000000); } }
这种写法的本质是把较大的64位整型拆分为两个32位整型,而后依次输出,低位的部分要补0。看似很笨的写法,效果如何?我把它和cout输出方式作了比较,由于它和cout都是C++支持跨平台的。首先printint64()和cout(不清空缓冲区)的运行结果是彻底相同的,不会出现错误。个人试验是分别用二者输出1000000个随机数,实际结果是,printint64()在1.5s内跑完了程序,而cout须要2s。cout要稍慢一些,因此在输出大量数据时,要尽可能避免使用。code