推 LPH66: 這裡主要是因為 printf 的問題, 短於 int 的整數會變成 int 09/22 18:50
→ LPH66: 才傳進 printf 裡面 09/22 18:50
→ LPH66: 你可以使用 C++ 的 cout << 方式印出, 它不會受此影響 09/22 18:51
恩恩,所以就是比 int 小的型別,在做運算的時候會先被轉成 int 對吧
這樣用 cout 還是要轉型別吧
cout << ~x << endl; // -32769
cout << (unsigned short)~x << endl; // 32767
→ Feis: try: printf("%hd\n", x); 09/22 19:01
這是 MSVC 才能用的語法嗎,還是其他的 C 編譯器都接受
※ 編輯: putumaxally (61.230.71.60), 09/22/2015 19:13:28
→ Feis: ? 這是標準阿 09/22 19:48
感謝大大,我都只看表格,沒發現作者在文章中有提到 h 跟 l,剛仔細找才發現
推 LPH66: 啊, 樓上點到了我忘了提的另一個重點了: 你這裡是用 %d %u 09/22 20:02
→ LPH66: 先回答一下上面的轉型問題, 這是因為 printf 是可變參數 09/22 20:03
→ LPH66: 只有可變參數函式才會經過這個轉換, cout << 是一般函式 09/22 20:04
→ LPH66: 因此不會有這種轉換 09/22 20:05
→ LPH66: 這跟 %d %u 的關係在於它們期待的是 int 型態的值 09/22 20:06
→ LPH66: 傳 short 進去會在可變參數那裡轉成 int 之後交給 %d %u 09/22 20:06
→ LPH66: 它們正好看到這是個 int 所以開心收下了, 造成你以為結果 09/22 20:06
→ LPH66: 被轉型成 int; 用 %hd 的話它會正確取出值裡面屬於 short 09/22 20:07
→ LPH66: 的部份印出, 就不會有錯誤的結果出現了 09/22 20:08
知道了,感謝大大的回覆
※ 編輯: putumaxally (61.230.71.60), 09/22/2015 21:56:04