作者khoguan (Khoguan Phuann)
看板C_and_CPP
标题Re: [问题] 关於printf的两个问题
时间Mon Jul 11 23:18:43 2005
※ 引述《SPower (xx)》之铭言:
: // 环境: WinXP
: // compiler: GNU C++ Compiler
: // 问题一
: #include <cstdio>
: #include <iostream>
: using namespace std;
: int main(int argc, char *argv[])
: {
: long long int n = 1;
: for(int i=1;i<63;i++)
: printf("2^%d = %lld\n",i,n*=2); //这里只能印出到2^31
: //就overflow了
long long 这个东西,直到 C99 才有正式纳入标准,C89 及
目前的 C++ 标准,并没有此物。但是各家编译器早就各行其是,
用不同方式去支援 long long 的使用。
虽然用的是 gcc, 但因为是在 Win 底下编译并连结到 Windows
系统提供的 C library,它要用 printf 印 long long 时,
不是用 %lld 而是用 %I64d
注:若是用 cygwin 的话,它预设是 link 其自身提供的 C library
所以仍用 %lld。但若不用预设,而在编译连结时指定 -mno-cygwin
那就又连到 Windows C lib 了。
: n = 1;
: for(int i=1;i<63;i++) { //这里却没有问题 why?
: n*=2;
: cout<<"2^"<<i<<" = "<<n<<endl;
C++ 的 iostream 聪明又安全,不用去指定输出的 type
将实作细节 encapsulate 了。
: }
: return 0;
: }
: 请问一下为什麽printf 会造成降子的情况呢?
: =================================================================
: 问题二: 关於printf 印出 long long int 应该是用 %lld 没错吧?
: 不过有下面的问题
: #include <cstdio>
: int main(int argc, char *argv[])
: {
: long long int x = 3, y = 4;
: printf("%lld %lld",x,y); //会印出x=3 y=0 不是各8bytes吗?
: ^^^^
解法同上。
: return 0; //怎麽y被x吃掉了? (抱歉我不知道该怎麽讲)
: }
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.130.208.168
1F:推 UNARYvvv:哈 我只知道 VC 里面用 %I64d 之前没试过gcc 61.70.137.117 07/11
2F:→ UNARYvvv:跟处理 __int64 一样 61.70.137.117 07/11
3F:推 SPower:很详尽..thanks, k大出来当板主吧~ 163.13.128.240 07/12
4F:推 renderer:khoguan 大太赞啦 推 61.222.148.171 07/12