//可惜VC++ 6.0 不认识 long long,会报error C2632: 'long' followed by 'long' is illegal
typedefsignedlonglong TSint64;//It's illegal in C90. It's legel in C99.
typedef unsigned longlong TUint64;
//typedef LONGLONG TSint64;//VC不认
//typedef ULONGLONG TUint64;
zz from http://www.byvoid.com/blog/c-int64/在C/C++中,64为整型一直是一种没有确定规范的数据类型。现今主流的编译器中,对64为整型的支持也是标准不一,形态各异。一般来说,64位整型的定义方式有long long和__int64两种(VC还支持_int64),而输出到标准输出方式有printf(“%lld”,a),printf(“%I64d”,a),和cout << a三种方式。本文讨论的是五种常用的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 longcout非C++正确非C++正确无法编译__int64cout非C++正确非C++无法编译无法编译long longprintint64()正确正确正确正确无法编译上表中,正确指编译通过,运行完全正确;错误指编译虽然通过,但运行结果有误;无法编译指编译器根本不能编译完成。观察上表,我们可以发现以下几点: