C/C++的64位整型
在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 long | cout | 非C++ | 正确 | 非C++ | 正确 | 无法编译 | 
| __int64 | cout | 非C++ | 正确 | 非C++ | 无法编译 | 无法编译 | 
| long long | printint64() | 正确 | 正确 | 正确 | 正确 | 无法编译 | 
上表中,正确指编译通过,运行完全正确;错误指编译虽然通过,但运行结果有误;无法编译指编译器根本不能编译完成。观察上表,我们可以发现以下几点:
- long long定义方式可以用于gcc/g++,不受平台限制,但不能用于VC6.0。
 - __int64是Win32平台编译器64位长整型的定义方式,不能用于Linux。
 - "%lld"用于Linux i386平台编译器,"%I64d"用于Win32平台编译器。
 - cout只能用于C++编译,在VC6.0中,cout不支持64位长整型。
 
表中最后一行输出方式中的printint64()是我自己写的一个函数,可以看出,它的兼容性要好于其他所有的输出方式,它是一段这样的代码:
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要稍慢一些,所以在输出大量数据时,要尽量避免使用。
转载:https://www.byvoid.com/blog/c-int64
C/C++的64位整型的更多相关文章
- 五种常用的C/C++编译器对64位整型的支持
		
变量定义 输出方式 gcc(mingw32) g++(mingw32) gcc(linux i386) g++(linux i386) MicrosoftVisual C++ 6.0 long lon ...
 - C++64位整型
		
今天在Ubuntu下编译C++代码,然后毫无防备的出现以下错误: 查阅了相关资料,__int64是VC++独有的,因此64位g++无法识别. 以下内容转载自:Byvoid 在C/C++中,64位整型一 ...
 - 编译器是如何实现32位整型的常量整数除法优化的?[C/C++]
		
引子 在我之前的一篇文章[ ThoughtWorks代码挑战——FizzBuzzWhizz游戏 通用高速版(C/C++ & C#) ]里曾经提到过编译器在处理除数为常数的除法时,是有优化的,今 ...
 - JavaScript 32位整型无符号操作
		
在 JavaScript 中,所有整数字变量默认都是有符号整数,这意味着什么呢? 有符号整数使用 31 位表示整数的数值,用第 32 位表示整数的符号,0 表示正数,1 表示负数. 数值范围从 -2^ ...
 - c++ 64位int
		
转自:https://www.byvoid.com/blog/c-int64 C/C++的64位整型 在C/C++中,64为整型一直是一种没有确定规范的数据类型.现今主流的编译器中,对64为整型的支持 ...
 - C/C++中的64位整数
		
C/C++中的64位整数(__int64 and long long) 在做ACM题时,经常都会遇到一些比较大的整数.而常用的内置整数类型常常显得太小了:其中long 和 int 范围是[-2^31, ...
 - GO语言学习——基本数据类型——整型、浮点型、复数、布尔值、fmt占位符
		
基本数据类型 整型 整型分为以下两个大类: 按长度分为:int8.int16.int32.int64 对应的无符号整型:uint8.uint16.uint32.uint64 其中,uint8就是我们熟 ...
 - 64位WINDOWS系统环境下应用软件开发的兼容性问题(CPU 注册表 目录)
		
应用软件开发的64 位WINDOWS 系统环境兼容性 1. 64 位CPU 硬件 目前的64位CPU分为两类:x64和IA64.x64的全称是x86-64,从名字上也可以看出来它和 x86是兼容的,原 ...
 - 关于整型Integer、Int32、Int64、IntPtr、UINT、UInt32、Cardinal、UInt64、UIntPtr、NativeUInt、Pointer、Handle
		
知识点1:UIntPtr = NativeUInt = Pointer = Handle 随程序的位数改变而改变.如下: 所以以后再用指针的时候要这样:UintPtr/NativeUInt(实例) = ...
 
随机推荐
- js保留两位小数方法总结
			
js保留两位小数方法总结 最近在做结算系统,经常需要用到金额保留两位小数,刚开始我一直用的是Angular中的过滤器number |2,但是,这无法满足我的需求.问题是,当用户离开文本框时,我需要将用 ...
 - WebAPI框架里设置异常返回格式统一
			
直接上代码 /// <summary> /// 消息代理处理,用来捕获这些特殊的异常信息 /// </summary> public class CustomErrorMess ...
 - 【设计模式】—— 备忘录模式Memento
			
前言:[模式总览]——————————by xingoo 模式意图 这个模式主要是想通过一个对象来记录对象的某种状态,这样有利于在其他需要的场合进行恢复. 该模式还有跟多可以扩展的地方,比如可以记录多 ...
 - BZOJ2553 Beijing2011禁忌(AC自动机+动态规划+矩阵快速幂+概率期望)
			
考虑对一个串如何分割能取得最大值.那么这是一个经典的线段覆盖问题,显然每次取右端点尽量靠前的串.于是可以把串放在AC自动机上跑,找到一个合法串后就记录并跳到根. 然后考虑dp.设f[i][j]表示前i ...
 - Fake or True(HNOI2018)
			
闲话 或许有人会问博主蒟蒻:ZJOI爆0记呢? 博主太弱了,刚刚去ZJ做了个梦回来,又得马不停蹄地准备HNOI 于是就成了烂坑 不过至少比某某更强更fake的xzz的游记要好一些 其实ZJOI挺值得回 ...
 - 【题解】 bzoj1923: [Sdoi2010]外星千足虫 (线性基/高斯消元)
			
bzoj1923,戳我戳我 Solution: 这个高斯消元/线性基很好看出来,主要是判断在第K 次统计结束后就可以确定唯一解的地方和\(bitset\)的骚操作 (我用的线性基)判断位置,我们可以每 ...
 - 【洛谷P2921】Trick or Treat on the Farm
			
题目大意:给定一个 N 个节点的内向树森林,求从每个顶点出发能够到达的最多不重复顶点的个数是多少. 题解:内向树森林是由一个或若干个环加若干条链构成.可以先按照类似于拓扑排序的规则进行删链,再对环上的 ...
 - isspace 对含有中文 的字符串进行检查的时候表现不正常!?
			
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> ...
 - PHP内核-代码的执行(二)
			
学习来源:http://www.php-internals.com/book/?p=chapt02/02-00-overview 最开始学习PHP的时候感觉上手真的好容易,噼里啪啦一个回车 “Hell ...
 - POJ - 2240 Arbitrage(Bellman-Ford)
			
https://vjudge.net/problem/POJ-2240 题意 已知n种货币,以及m种货币汇率及方式,问能否通过货币转换,使得财富增加. 分析 Bellman-Ford判断正环,注意初始 ...