看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Dev-C++ 5.11 問題(Question): 對 unsigned short 做 bitwise not 運算, 在 printf 顯示的結果很奇怪 結果(Wrong Output): (short)x = -32768 x = 32768 x = 32768 ~x = -32769 ~x = 4294934527 (unsigned short)~x = 32767 程式碼(Code):(請善用置底文網頁, 記得排版) unsigned short x = 32768; printf(" (short)x = %d\n", (short)x); // -32768 printf(" x = %d\n", x); // 32768 printf(" x = %u\n", x); // 32768 printf(" ~x = %d\n", ~x); // -32769 printf(" ~x = %u\n", ~x); // 4294934527 printf("(unsigned short)~x = %d\n", (unsigned short)~x);// 32767 補充說明(Supplement): 從第二個 printf 看來,編譯器好像會檢查 %d 是不是 unsigned 可是如果使用 bitwise not 計算過後,型別好像就變成 int 了 C語言的規格有這方面的規定嗎,還是單純是依照編譯器本身的設定 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.230.71.60 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1442918448.A.6A3.html ※ 編輯: putumaxally (61.230.71.60), 09/22/2015 18:42:23
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