数据类型MSVC和gcc/g++的不同
在16位环境下,int/unsigned
int 占16位,long/unsigned long占32位
在32位环境下,int占32位,unsigned
int占16位,long/unsigned long占32位
何时需要使用:
long
和 int
范围是[-2^31,2^31),即-2147483648~2147483647,而unsigned范围是[0,2^32),即0~4294967295,所以常规的32位整数只能够处理40亿左右,当遇到比40亿大的多的数就要用到64位。
64位使用范围:
不 同的编译器对64位整数的扩展有所不同,VC使用__int64/unsigned __int64,范围是[-2^63,
2^63)和[0,2^64),即-9223372036854775808~9223372036854775807与
0~18446744073709551615(约1800亿亿)。
注意点:
1、编译器不同导致使用64位的申明方式不同;
2、long long
/ unsigned long long 一般是Linux下申明方式、如:G++
3、__int64
/unsigned __int64一般是Windows下使用64位的申明方式,如:VS
4、在赋值时需要注意加上ll进行显式赋值;
5、当进行64位与
32位的混合运算时,32位整数会被隐式转换成64位整数。
6、输出printf("");,long
long使用%lld输出,__int64使用%I64d,无符号使用u替代d即可。
7、测试下来编译器一般都支持2种操作,不必太过纠结,怎么使用看个人喜欢。
//=================================华丽的分隔线========================================
#include
<stdio.h>
#include
<stdlib.h>
intmain(){
unsigned
long longa=
412432424000ll;
unsigned
__int64b=
9223372036854775808ll;
printf("%I64u\n",a); //使用%lld时无法正常输出,why?
解答在附
printf("%I64u",b);
system("pause");
return
0;
}
附网友测试结果:
刚实验了下,在VC6、DEV、CodeBlocks中C语言都可以使用__int64,格式化输出标识为%I64d。不过在VC6中数字后加2个L是会报错,可以只加1个或不加。查了下资料,__int64是windows专用的,被vc、gcc等编译器支持,但在在UNIX、Linux中需用long
long配合%lld。后者是标准C的规定!
我试了下long
long配合%I64d,可以正确输出,而不管是long
long还是__int64配合%lld都不能正确输出。所以我得出的结论是在windows下需要用longlong或,__int64配合dd。而在UNIX、Linux中必须使用标准C规定的long
long配合%lld。
记。
(http://hi.baidu.com/tianxingjianhd/blog/item/c44bec3a221fc1ff14cecbf6.html)
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要稍慢一些,所以在输出大量数据时,要尽量避免使用。
数据类型MSVC和gcc/g++的不同的更多相关文章
- CentOS 6.6 升级GCC G++ (当前最新版本为v6.1.0) (完整)
---恢复内容开始--- CentOS 6.6 升级GCC G++ (当前最新GCC/G++版本为v6.1.0) 没有便捷方式, yum update.... yum install 或者 添加y ...
- Clang比 gcc/g++更人性化代码出错提示的C/C++编译器
编译器方面的几个命令 gcc/g++ 一. 常用编译命令选项 常用用法 gcc -Wall test.c -o test gcc编译过程 .c ->(-E)-> .i[中间文件] -> ...
- Linux 之 编译器 gcc/g++参数详解
2016年12月9日16:48:53 ----------------------------- 内容目录: [介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g++ ...
- ubuntu 14.04 更新 gcc/g++ 4.9.2
ubuntu 14.04 更新 gcc/g++ 4.9.2 最近看到c++11非常的好用,尤其是自带了regex,于是稍微学了一下c++11的新特性.可是我在编译一个regex程序是却发现稍微复杂一点 ...
- [vim配置]windows下在vim中使用gcc/g++编译调试c/cpp文件
在Linux里面混了一个多月,vim编程用得甚爽.无奈前天将Linux里面的编程文件夹误删,而技术不精无法找回,悲痛欲绝.再者,无限怀念windows里面的游戏,并觉得现在在Linux里面也学不到什么 ...
- gcc/g++链接时.o文件及库的顺序问题
折腾gcc/g++链接时.o文件及库的顺序问题 链接静态库的顺序问题 GCC 编译使用动态链接库和静态链接库--及先后顺序----及环境变量设置总结
- [转]Linux下用gcc/g++生成静态库和动态库(Z)
Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10| 分类: linux | 标签:链接库 linux g++ gcc |举报|字号 订阅 ...
- Linux-编译器gcc/g++编译步骤
gcc和g++现在是gnu中最主要和最流行的c&c++编译器.g++是c++的命令,以.cpp为主:对于c语言后缀名一般为.c,这时候命令换做gcc即可.编译器是根据gcc还是g++来确定是按 ...
- gcc/g++ 静态动态库 混链接.
我的环境: centos6 x64. gcc4.4.7 在使用gcc/g++ 编译程序时我们希望指向一些库是使用静态的链接方式. 另外的一些是动态的方式. 我以boost 为例. 如果我们要使用静态库 ...
随机推荐
- XML基础<第一篇>
一.XML简介 XML是一种标记语言,用于描述数据,它提供一种标准化的方式来来表示文本数据.XML文档以.xml为后缀.需要彻底注意的是XML是区分大小写的. 先从一个简单的XML例子来了解下xml基 ...
- elasticsearh 中每个节点中需要有相同的插件
elasticsearh 中每个节点中需要有相同的插件 [2016-09-13 19:25:24,049][INFO ][discovery.zen ] [node02] failed to send ...
- jquery中table里面的tr里的input添加一行,并且第一列autoincrement
实现添加一行并且第一列由A0开始autoincrement,代码如下(在文件的同一个文件夹下添加一个jquery.js文件): <!DOCTYPE html PUBLIC "-//W3 ...
- UVa133.The Dole Queue
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- the5fire博客对接微信公众平台接口 | the5fire的技术博客
the5fire博客对接微信公众平台接口 | the5fire的技术博客 the5fire博客对接微信公众平台接口
- qt QSortFilterProxyModel
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' from PyQt4.Qt import * from PyQt4. ...
- 分割视图控制器(UISplitViewController) 改_masterColumnWidth 导致在 IOS 10中出现闪退
默认UISplitViewController的Master和Detail的宽度是固定的,可以通过下面的方式来改变 [splitViewController setValue:[NSNumber nu ...
- 《JavaScript 闯关记》之 DOM(下)
Element 类型 除了 Document 类型之外,Element 类型就要算是 Web 编程中最常用的类型了.Element 类型用于表现 XML 或 HTML 元素,提供了对元素标签名.子节点 ...
- asp.net 页面上传文件控件后台代码Request.Files获取不到
今天开发中遇到页面文件上传控件选择了文件,而后台Request.Files.Count取值为0,之前开发中遇到过几次,老是忘掉,今天记下来. html: <input type="fi ...
- django中使用原生sql
在Django中使用原生Sql主要有以下几种方式: 一:extra:结果集修改器,一种提供额外查询参数的机制 二:raw:执行原始sql并返回模型实例 三:直接执行自定义Sql ( 这种方式完全不依赖 ...