c++ 64位int

转自:https://www.byvoid.com/blog/c-int64

C/C++的64位整型

在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

 

  1. long long定义方式能够用于gcc/g++,不受平台限制,但不能用于VC6.0。
  2. __int64是Win32平台编译器64位长整型的定义方式,不能用于Linux。
  3. "%lld"用于Linux i386平台编译器,"%I64d"用于Win32平台编译器。
  4. cout只能用于C++编译,在VC6.0中,cout不支持64位长整型。

表中最后一行输出方式中的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

相关文章
相关标签/搜索