[問題] 為什麼這兩種寫法 出來的結果相異(有關 …

看板C_and_CPP (C/C++)作者時間16年前 (2009/07/21 18:23), 編輯推噓6(6011)
留言17則, 5人參與, 最新討論串1/1
在練習位元邏輯運算子 的語法時 發現底下第二種寫法 跟第一種寫法 跑出來的結果不一樣 想請問一下是第二種寫法 哪裡出了問題呢 第一種寫法:(跑出來的結果是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; }

07/21 18:32, , 1F
第一種印的是 xx 吧, 如果都是印 ~x 沒可能會不一樣的
07/21 18:32, 1F
對 我打錯了orz 應該印的是xx 上面的文章改過來了|||

07/21 18:40, , 2F
"," 很神秘 能不用盡量不要用到 你永遠不知道他的求值順序
07/21 18:40, 2F
但即使我把第一種寫法的 unsigned short int x=100,xx=~x; 改成 unsigned short int x=100; xx=~x; 第一種寫法跑出來的結果還是65435 所以這邊應該不是,的問題|||

07/21 18:41, , 3F
static_cast<unsigned short>(~x)
07/21 18:41, 3F

07/21 18:41, , 4F
第二種寫法的 cout << 後面改這樣。
07/21 18:41, 4F
謝謝 第二種寫法 跟第一種寫法 跑出一樣的東西了!

07/21 18:45, , 5F
http://codepad.org/tYZ0nRGm VC 跟 gcc 第一種都印-101,你..
07/21 18:45, 5F
sorry||| 是我內文打錯了|||

07/21 18:47, , 6F
我想他第一個應該是印xx才會那樣
07/21 18:47, 6F
沒錯XD||| ※ 編輯: bookticket 來自: 140.112.125.84 (07/21 18:51)

07/21 18:58, , 7F
很簡單,因為用函數印~x時,一定要先把x值取出後,才能做一個
07/21 18:58, 7F

07/21 18:59, , 8F
補數運算。而xx要印的時候,編譯器知道他的資料型態是無號數
07/21 18:59, 8F

07/21 19:05, , 9F
我想問題在為什麼compiler會把(~x) cast成int..
07/21 19:05, 9F

07/21 19:05, , 10F
standard有規定?
07/21 19:05, 10F

07/21 19:11, , 11F
這叫 promotion,~x 的 promotion 規則同 (-x) - 1。
07/21 19:11, 11F

07/21 19:13, , 12F
cout << sizeof(x) 和 sizeof(~x) 可以看見大小不同。
07/21 19:13, 12F

07/21 19:14, , 13F
-x 會把型別晉升成 signed int,所以 ~x 也會。
07/21 19:14, 13F

07/21 19:15, , 14F
感覺這樣認定,好像CPU需要跑的指令可以比較少,是嗎?
07/21 19:15, 14F

07/21 19:17, , 15F
不是,單純就是 spec,附帶一提 Java 也是這樣學過去。
07/21 19:17, 15F

07/21 19:18, , 16F
原來如此。
07/21 19:18, 16F

07/22 00:29, , 17F
嗯 我也記得是 promotion .... 之前回的時候忘了這個詞
07/22 00:29, 17F
文章代碼(AID): #1APPS7k1 (C_and_CPP)
文章代碼(AID): #1APPS7k1 (C_and_CPP)