看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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
UNARYvvv:哈 我只知道 VC 裡面用 %I64d 之前沒試過gcc 61.70.137.117 07/11
UNARYvvv:跟處理 __int64 一樣 61.70.137.117 07/11
SPower:很詳盡..thanks, k大出來當板主吧~ 163.13.128.240 07/12
renderer:khoguan 大太讚啦 推 61.222.148.171 07/12