﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-kidlet 's-文章分类-C++</title><link>http://www.cppblog.com/kidlet/category/15798.html</link><description>羊仔            Kidlet.co.cc</description><language>zh-cn</language><lastBuildDate>Tue, 28 Dec 2010 21:00:15 GMT</lastBuildDate><pubDate>Tue, 28 Dec 2010 21:00:15 GMT</pubDate><ttl>60</ttl><item><title>C++ 中__int64的用法</title><link>http://www.cppblog.com/kidlet/articles/137633.html</link><dc:creator>Kidlet</dc:creator><author>Kidlet</author><pubDate>Tue, 28 Dec 2010 18:01:00 GMT</pubDate><guid>http://www.cppblog.com/kidlet/articles/137633.html</guid><wfw:comment>http://www.cppblog.com/kidlet/comments/137633.html</wfw:comment><comments>http://www.cppblog.com/kidlet/articles/137633.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kidlet/comments/commentRss/137633.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kidlet/services/trackbacks/137633.html</trackback:ping><description><![CDATA[<p style="FONT-FAMILY: 微软雅黑; FONT-SIZE: 10pt">今天忙一道学校数科oj题目,没想到居然数值溢出,本以为long类型够用了,无奈居然不知道C++里面的int64类型,只好百度之<br><br>在做ACM题时，经常都会遇到一些比较大的整数。而常用的内置整数类型常常显得太小了：其中long 和 int 范围是[-2^31,2^31)，即-2147483648~2147483647。而unsigned范围是[0,2^32)，即 0~4294967295。也就是说，常规的32位整数只能够处理40亿以下的数。</p>
<p style="FONT-FAMILY: 微软雅黑; FONT-SIZE: 10pt">　　那遇到比40亿要大的数怎么办呢？这时就要用到C++的 64位扩展了。不同的编译器对64位整数的扩展有所不同。基于ACM的需要，下面仅介绍VC6.0与g++编译器的扩展。<!--iwms_ad_begin--></p>
<!--iwms_ad_end-->
<p style="FONT-FAMILY: 微软雅黑; FONT-SIZE: 10pt"></p>
<p style="FONT-FAMILY: 微软雅黑; FONT-SIZE: 10pt">　　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的兼容就不是很好了，如果你写下这样一段代码：</p>
<p style="FONT-FAMILY: 微软雅黑; FONT-SIZE: 10pt">1&nbsp; __int64 a;</p>
<p style="FONT-FAMILY: 微软雅黑; FONT-SIZE: 10pt">2 cin &gt;&gt; a;</p>
<p style="FONT-FAMILY: 微软雅黑; FONT-SIZE: 10pt">3 cout &lt;&lt; a;</p>
<p style="FONT-FAMILY: 微软雅黑; FONT-SIZE: 10pt">那么，在第2行会收到&#8220;error C2679: binary '&gt;&gt;' : no operator defined which takes a right-hand operand of type '__int64' (or there is no acceptable conversion)&#8221;的错误；在第3行会收到&#8220;error C2593: 'operator &lt;&lt;' is ambiguous&#8221;的错误。那是不是就不能进行输入输出呢？当然不是，你可以使用C的写法：</p>
<p style="FONT-FAMILY: 微软雅黑; FONT-SIZE: 10pt">scanf("%I64d",&amp;a);</p>
<p style="FONT-FAMILY: 微软雅黑; FONT-SIZE: 10pt">printf("%I64d",a);就可以正确输入 输出了。当使用unsigned __int64时，把"I64d"改为"I64u"就可以了。</p>
<p style="FONT-FAMILY: 微软雅黑; FONT-SIZE: 10pt">　　OJ通常使用g++编译器。其64位扩展方式 与VC有所不同，它们分别叫做long long 与 unsigned long long。处理规模与除输入输出外的使用方法同上。对于输入输出，它的扩展比VC好。既可以使用</p>
<p style="FONT-FAMILY: 微软雅黑; FONT-SIZE: 10pt">1long long a;</p>
<p style="FONT-FAMILY: 微软雅黑; FONT-SIZE: 10pt">2cin&gt;&gt;a;</p>
<p style="FONT-FAMILY: 微软雅黑; FONT-SIZE: 10pt">3cout&lt;&lt;a;也可以使用</p>
<p style="FONT-FAMILY: 微软雅黑; FONT-SIZE: 10pt">scanf("%lld",&amp;a);</p>
<p style="FONT-FAMILY: 微软雅黑; FONT-SIZE: 10pt">printf("%lld",a);</p>
<p style="FONT-FAMILY: 微软雅黑; FONT-SIZE: 10pt">使用无 符号数时，将"%lld"改成"%llu"即可。</p>
<p style="FONT-FAMILY: 微软雅黑; FONT-SIZE: 10pt">如果你使用的是Dev-C++的g++编译器，它使用的 是"%I64d"而非"%lld"。</p>
<img src ="http://www.cppblog.com/kidlet/aggbug/137633.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kidlet/" target="_blank">Kidlet</a> 2010-12-29 02:01 <a href="http://www.cppblog.com/kidlet/articles/137633.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>