今夜IT网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1685|回复: 2

__int64 类型(VC中)与long long 型(gcc中,C99标准)

[复制链接]
发表于 2012-2-8 23:11:34 | 显示全部楼层 |阅读模式
    int64 是有符号 64 位整数数据类型,也就是 C# 中的 long 和 SQL Server 中的 bigint,范围为 -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807),存储空间占 8 字节。用于整数值可能超过 int 数据类型支持范围的情况。
    c#中:
    Int64 值类型表示值介于 -9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807 之间的整数。

    Int64 为比较此类型的实例、将实例的值转换为它的字符串表示形式以及将数字的字符串表示形式转换为此类型的实例提供了相应的方法。

    警告 在 32 位 Intel 计算机上分配 64 位值不是原子操作;即该操作不是线程安全的。这意味着,如果两个人同时将一个值分配给一个静态 Int64 字段,则该字段的最终值是无法预测的。
    有关格式规范代码如何控制值类型的字符串表示形式的信息,请参见格式化概述。此类型实现接口 IComparable、IFormattable 和 IConvertible。使用 Convert 类进行转换,而不是使用此类型的 IConvertible 显式接口成员实现。

    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif C语言INT64  (VC中)

    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif__int64 是一个关键字,用_int64 来可以指定一个64位的整型变量

    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif
    __int8 nSmall;      // 声明 8位 整数
    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif
    __int16 nMedium;    // 声明 16位 整数
    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif
    __int32 nLarge;     // 声明 32位 整数
    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif
    __int64 nHuge;      // 声明 64位 整数
    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif  

    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.giflong   long是C99标准的C语言内置类型。需要符合C99的编译器

    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif g++ /gcc中

    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif
    long long a;
    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gifprintf(\"%lld\",a);  

    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif
    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gifmingw32 中

    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif
    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif__int64 a;

    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gifprintf(\"%I64d\",a);  

    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif源文档 <http://blog.csdn.net/luxuejuncarl/archive/2007/04/18/1568457.aspx>


    在做ACM题时,经常都会遇到一些比较大的整数。而常用的内置整数类型常常显得太小了:其中long 和 int 范围是[-2^31,2^31),即-2147483648~2147483647。而unsigned范围是[0,2^32),即0~4294967295。也就是说,常规的32位整数只能够处理40亿以下的数。
    那遇到比40亿要大的数怎么办呢?这时就要用到C++的64位扩展了。不同的编译器对64位整数的扩展有所不同。基于ACM的需要,下面仅介绍VC6.0与g++编译器的扩展。
    VCVC6.0的64位整数分别叫做__int64与unsigned __int64,其范围分别是[-2^63, 2^63)与[0,2^64),即-9223372036854775808~9223372036854775807与0~18446744073709551615(约1800亿亿)。对64位整数的运算与32位整数基本相同,都支持四则运算与位运算等。当进行64位与32位的混合运算时,32位整数会被隐式转换成64位整数。但是,VC的输入输出与__int64的兼容就不是很好了,如果你写下这样一段代码:
    1

    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif__int64 a;
    2

    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gifcin >> a;
    3

    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gifcout << a;
    那么,在第2行会收到“error C2679: binary '>>' : no operator defined which takes a right-hand operand of type '__int64' (or there is no acceptable conversion)”的错误;在第3行会收到“error C2593: 'operator <<' is ambiguous”的错误。那是不是就不能进行输入输出呢?当然不是,你可以使用C的写法:

    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gifscanf(\"%I64d\",;a);

    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gifprintf(\"%I64d\",a);
    就可以正确输入输出了。当使用unsigned __int64时,把\"I64d\"改为\"I64u\"就可以了。
    OJ通常使用g++编译器。其64位扩展方式与VC有所不同,它们分别叫做long long 与 unsigned long long。处理规模与除输入输出外的使用方法同上。对于输入输出,它的扩展比VC好。既可以使用
    1

    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.giflong long a;
    2

    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gifcin>>a;
    3

    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gifcout<<a;
    也可以使用

    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gifscanf(\"%lld\",;a);

    file:///C:/Users/liufei/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gifprintf("%lld",a);
    使用无符号数时,将"%lld"改成"%llu"即可。
    最后我补充一点:作为一个特例,如果你使用的是Dev-C++的g++编译器,它使用的是"%I64d"而非"%lld"。

    源文档 <http://jdzzgtc.blog.163.com/blog/static/1631216220099814450401/>

0

主题

1

帖子

39

积分

新手上路

积分
39
发表于 2013-12-1 16:00:12 | 显示全部楼层
看过必回,人品超好!












淘宝装修素材
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回列表 官方QQ群

QQ|小黑屋|手机版|今夜IT网 (京ICP备11034012号) 

Powered by Discuz! X3.2

快速回复 返回顶部 返回列表