DSP

整理C/C++中的64位整型

2019-07-13 18:37发布

本篇文章转载自:VC驿站:http://www.cctry.com/thread-277221-1-1.html
最近给大家录制讲解C++基础方面的教程,刚讲到数据类型这块。地址如下:http://www.cctry.com/thread-277142-1-1.html
关于基本类型中的整型,默认的一些 short、int、long 等大家都比较熟悉。int、long 占用 4 个字节32位,最大能表示的无符号正整数也才是 4294967295,也就是 42亿多。现如今社会中各种各样的数量需要整型来表示,但数目已远远超过 4294967295,比如当今的世界人口,等等。比如开发过程中经常要用到的毫秒级时间戳,即代表从1970年到现在为止经过的毫秒数。这些数值都超过了 4294967295,普通的 int 和 long 已经无法表示的下了,所以又出现占用 8个字节的64位整型:long long、_int64、__int64,其无符号能表示的最大正整数是:18446744073709551615,已经非常大了。。。可为什么有三种?下面给大家说下!

C99标准以前:
64位整型是一种没有明确规范的数据类型,各种主流的编译器对64位整型的支持也是标准不一,形态各异。于是便出了 long long、_int64、__int64 这么几种;

C99标准推出:
C99将 long long 纳入到 C++标准中,并规定 long long 类型的位数不低于64位;
Linux上GCC从4.5版本开始,完全支持C99标准,因此可以使用 long long 表示64位整数;
Windows 下 VC6.0 是1998年推出的,所以不支持C99标准,但是Windows为了支持64位整型,自己提供了__int64 类型来表示64位整数,VC6.0中还可以使用少一个下划线的版本 _int64

C++11标准推出:
long long 进入了 C++11 标准,同样定义为位数不低于64位;
GCC4.8开始支持 C++11,将 long long 型定义为64位,Visual Studio 2013 开始支持 C++11,同样将 long long 定义为64位。

备注:不过微软为了支持以前的程序代码,所以在 VC6.0 以及以后的编译器中都支持 _int64 及 __int64 类型。

好了,8个字节64位的整型我们搞清楚了之后,那么在进行打印输出或者格式化字符串的时候,用 % 什么呢?普通的 %d 肯定是不行了,应该用什么呢?long long => %lld
unsigned long long => %llu
__int64 => %I64d
unsigned __int64 => %I64uOK了,基本就给大家讲完了。为了通用性和移植性,建议大家还是使用 long long 类型吧,不过如果大家手头还是古董级别的 VC6.0 或者 低于支持 C++11 标准版本的编译器:VS2002、VS2003、VS2005、VS2008、VS2010、VS2012,那么只能使用 __int64 了。

有的网友会说了,long long 太长了,unsigned long long 更长,还是不如 __int64 方便!其他网友要说了,你直接 typedef 一下不就得了就可以使用短名字了:
typedef signed long long                TSint64;
typedef unsigned long long                TUint64;这样定义完之后可以直接使用 TSint64 和 TUint64 了。

以上!本篇文章转载自:VC驿站:http://www.cctry.com/thread-277221-1-1.html