看板 C_and_CPP 關於我們 聯絡資訊
在練習位元邏輯運算子 的語法時 發現底下第二種寫法 跟第一種寫法 跑出來的結果不一樣 想請問一下是第二種寫法 哪裡出了問題呢 第一種寫法:(跑出來的結果是65435) #include <iostream> #include <stdlib.h> using namespace std; int main(void) { unsigned short int x=100,xx=~x; cout << "x=01100100\n"; cout << "not x ==> " << xx << "\n"; system("pause"); return 0; } 第二種寫法(跑出來的結果是-101): #include <iostream> #include <stdlib.h> using namespace std; int main(void) { unsigned short int x=100; cout << "not x ==> " << ~x << "\n"; system("pause"); return 0; }
ledia:第一種印的是 xx 吧, 如果都是印 ~x 沒可能會不一樣的 07/21 18:32
對 我打錯了orz 應該印的是xx 上面的文章改過來了|||
akasan:"," 很神秘 能不用盡量不要用到 你永遠不知道他的求值順序 07/21 18:40
但即使我把第一種寫法的 unsigned short int x=100,xx=~x; 改成 unsigned short int x=100; xx=~x; 第一種寫法跑出來的結果還是65435 所以這邊應該不是,的問題|||
tinlans:static_cast<unsigned short>(~x) 07/21 18:41
tinlans:第二種寫法的 cout << 後面改這樣。 07/21 18:41
謝謝 第二種寫法 跟第一種寫法 跑出一樣的東西了!
zlw:http://codepad.org/tYZ0nRGm VC 跟 gcc 第一種都印-101,你.. 07/21 18:45
sorry||| 是我內文打錯了|||
akasan:我想他第一個應該是印xx才會那樣 07/21 18:47
沒錯XD||| ※ 編輯: bookticket 來自: 140.112.125.84 (07/21 18:51)
zlw:很簡單,因為用函數印~x時,一定要先把x值取出後,才能做一個 07/21 18:58
zlw:補數運算。而xx要印的時候,編譯器知道他的資料型態是無號數 07/21 18:59
Fenikso:我想問題在為什麼compiler會把(~x) cast成int.. 07/21 19:05
Fenikso:standard有規定? 07/21 19:05
tinlans:這叫 promotion,~x 的 promotion 規則同 (-x) - 1。 07/21 19:11
tinlans:cout << sizeof(x) 和 sizeof(~x) 可以看見大小不同。 07/21 19:13
tinlans:-x 會把型別晉升成 signed int,所以 ~x 也會。 07/21 19:14
zlw:感覺這樣認定,好像CPU需要跑的指令可以比較少,是嗎? 07/21 19:15
tinlans:不是,單純就是 spec,附帶一提 Java 也是這樣學過去。 07/21 19:17
zlw:原來如此。 07/21 19:18
ledia:嗯 我也記得是 promotion .... 之前回的時候忘了這個詞 07/22 00:29