C 位操作 左移32位 錯誤

搬磚拼接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也是徒勞!!!

既然答案如此,沒辦法,只能儘量避免這種操作了!!!!



























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章