搬磚拼接64位數字,因高32位long未先強轉64,導致拼接失敗,順便發現個問題,32位變量左移32位等於原數值。C下位移操作爲邏輯位移,全部左移補零後,數值應爲零,結果和預期不符,遂查找癥結所在。
代碼如下:
long i = 512;
i = i << 32;
結果i == 512
作爲對比:32次i << 1結果是0
short i = 512;
i = i << 16;
結果i == 0
所以,第一種情況是個特例。
彙編代碼上,shl 20h,shl 1,都是shl
經過一系列對比發現:
初始值512不是重點,初始其他值也是一樣效果。;
short 左移32也會出問題,char左移32也會出問題,而二者左移對應的16位和8位都不會有問題,所以問題出在左移32?????!!!!(除了64位的long long ,左移32位纔不是原數字,64位是)
GCC編譯測試
警告:<<操作達到或者超過類型大小
這個warning也很詭異,針對的不是操作數的類型,還是32位。
例如,long 左移32,會提示這個,short左移16,不會提示。
網上資料
基本都是根據結果猜答案的,類型大小模運算都出來了,那你照顧過16位數的感受嗎?16位數左移17位爲什麼不等於左移1位??
雖然和我的實操結果相同,但是這種拿結果推理論的說法還是不敢太認同。。
英文版資料:
類型強轉,這也解釋了char和short都只有左移32才異常!!!!!!!即使我用(char)i << 32也是徒勞!!!
既然答案如此,沒辦法,只能儘量避免這種操作了!!!!