[問題] bitwise not 跟 unsigned short
看板C_and_CPP (C/C++)作者putumaxally (putumaxally)時間10年前 (2015/09/22 18:40)推噓2(2推 0噓 12→)留言14則, 2人參與討論串1/1
開發平台(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
推
09/22 18:50, , 1F
09/22 18:50, 1F
→
09/22 18:50, , 2F
09/22 18:50, 2F
→
09/22 18:51, , 3F
09/22 18:51, 3F
恩恩,所以就是比 int 小的型別,在做運算的時候會先被轉成 int 對吧
這樣用 cout 還是要轉型別吧
cout << ~x << endl; // -32769
cout << (unsigned short)~x << endl; // 32767
→
09/22 19:01, , 4F
09/22 19:01, 4F
這是 MSVC 才能用的語法嗎,還是其他的 C 編譯器都接受
※ 編輯: putumaxally (61.230.71.60), 09/22/2015 19:13:28
→
09/22 19:48, , 5F
09/22 19:48, 5F
感謝大大,我都只看表格,沒發現作者在文章中有提到 h 跟 l,剛仔細找才發現
推
09/22 20:02, , 6F
09/22 20:02, 6F
→
09/22 20:03, , 7F
09/22 20:03, 7F
→
09/22 20:04, , 8F
09/22 20:04, 8F
→
09/22 20:05, , 9F
09/22 20:05, 9F
→
09/22 20:06, , 10F
09/22 20:06, 10F
→
09/22 20:06, , 11F
09/22 20:06, 11F
→
09/22 20:06, , 12F
09/22 20:06, 12F
→
09/22 20:07, , 13F
09/22 20:07, 13F
→
09/22 20:08, , 14F
09/22 20:08, 14F
知道了,感謝大大的回覆
※ 編輯: putumaxally (61.230.71.60), 09/22/2015 21:56:04
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章
-3
16