伊谢尔伦2017-04-17 13:10:09
轉換的時候不會全部放1,注意下面
這是2000 的二進位表示0100 1110 0010 0000
在縮短到1 byte
的char
後,應該是保留後面的0010 0000
,而這個數十進位表示就是32
PHP中文网2017-04-17 13:10:09
首先你需要去看一本叫D&E的書. 再者, 這個鍋應該摔給C語言.
C++在設計的時候就想要去兼容C語言, 所以char和int之間的隱式轉換(沒有任何編譯錯誤警告)是C帶來的. 而一個大於char最大值的int, 轉化成char時, 這個行為應該是未定义行为
. 具體就不要深究了, 你只需要知道這樣寫程式碼是不對的.
PS:
樓上給你的解釋, 只是一個特定編譯器下的實現, 站在未定義行為的角度看, 不管任何編譯器怎麼實現, 他都是合法的.
我記得以前寫程序用移位操作, 當時並不太清楚用有符號整數會出現什麼後果, 結果後來程序在gcc下面跑的很好, 在vc下面就是不行. 直到後來看書, 後來所有的位運算都用uint32_t
或unint64_t
.
The value of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a non-negative value, the value of the result is the integral part quotient of E1/2E2. If E1 has a signed type and a negative value, the resulting value is implementation-defined.