1樓:Larry Sean
這裡的編譯器優化,主要是將乘除法優化為了更快的位移操作和加減法。
首先看到x左移了4位,想到乘了16,下一句又減去乙個x,可以想到這裡的操作相當於
x = x * (16 - 1);
也就是M = 15。
下乙個if語句比較可疑,為什麼只在小於0的時候才處理呢?
先跳過,看到最後一句右移兩位,想到就是 y / 4.
這時考慮除不盡的情況應該向零取整,如果機器使用了算數右移,結果會向負無窮取整。正數滿足向零取整,而負數就不對了,因此,對於所有的負數加3修正,就得到了向零取整的結果。
因此,最後的結果是 M = 15, N = 4
並且可以推斷這台機器使用的是算數右移(因為C++中對於負數的右移的具體行為是根據實現決定的
(所以推斷沒什麼用:不推薦對有符號型別使用位操作符。
補充:C++11標準才規定了除法一定要向零取整,如果是之前的C++版本編譯要根據實現來。我也是看到+3修正才判斷是修正向零取整這個原因的。
// 儘管題目裡問的是C,我還是強行寫了C++標準。。因為C的標準我還沒看過,就不說了。有點遺憾
關於c 類中的this問題,成員函式過載
薛丁格的貓 我覺得你可能有一點沒搞清楚 this應為Screen const,為一常量指標,所指位址不能改變 位址確實是不可變的,但是指標指向的內容並不是常量,this表示的是指標指向的內容,應該是可以修改的。你可以從這一方面理解一下。 C primer這附近似乎是表述有誤 By default,t...
關於 C 中模板的顯示實參的匹配順序問題?
莊嚴 template classT2,class T3 T3f T1a,T2b 然後 f 3L 4 此時,double 和 3L同時試圖指定T1 的型別 然後,按照規定,顯式指定勝出,也就是 double勝出,long 失敗。所以傳入3L實際被轉換為double。可以這樣證明 include in...
關於C中的符號 ?
時夢 int p 4 array 這裡 p是指向陣列的指標,所以在使用時要加兩個 如果想要把p定義為陣列應該用 int p 4 array 此時可以直接用 p 1 2 效果等價於 p 1 2 ps 有一點需要注意的是 在C和C 裡,對指標變數的宣告 和 都是識別符號的一部分 我曾經在這裡暈了好久 屠...