Intel的移位指令存在的坑

2021-07-11 09:09:07 字數 929 閱讀 4908

前幾天在調路由下發的時候碰到乙個很詭異的錯誤,計算機執行的結果跟我手算的結果就是對不到一塊兒,當時的**是這樣的

ina.ifra_mask.sin_addr.s_addr = htonl(~(0xffffffffu >> prefix_len));
其中prefix_len的值為32。自己預想的結果應該是右移32bit讓括號內變為0,然後在取反變成全1,最後調整調整位元組序後結果也是全為1。但是很無奈,計算機算出來的結果就是0。

在糾結了半小時,突然想到以前看過一篇關於intel的移位指令存在的缺陷的文章,這是文章的鏈結。這篇文章寫了右移指令在碰到計數運算元大於31時就會發生意料之外的結果,在這裡我想說不僅僅是右移有這個問題,左移同樣存在這個問題。

下面這段**是我的測試**:

int prefix_len = 32;

inty = htonl(~(0xffffffffu >> prefix_len));

printf("y is %x\n", y);

通過gcc編譯產生乙個可執行檔案,執行的結果是:

當把prefix_len改為0-31時,移位是正常的,如:

咱們在來試試prefix_len=33和prefix_len=1的情況,

先是=33:

然後是=1:

所以以後在試用移位指令的時候自己多留個心眼吧,別超範圍了。

iOS KVO存在的坑

所有的設計模式最終目的都是乙個,就是要解耦。解耦 是指任何模組之間不存在硬關聯,都是可以對關聯進行修改與替換。這是提供系統的可擴充套件性和可維護性的基礎,降低模組 元件之間的耦合度是開發人員應該牢記的乙個程式設計準側。觀察者模式是一種行為型設計模式。行為型設計模式討論的是模組實體在執行過程中的行為模...

ARM指令集的移位操作

arm 微處理器內嵌的桶型移位器 barrel shifter 支援資料的各種移位操作,移位操作在 arm 指令集中不作為單獨的指令使用,它只能作為指令格式中是乙個字段,在組合語言中表示為指令中的選項。例如,資料處理指令的第二個運算元為暫存器時,就可以加入移位操作選項對它進行各種移位操作。移位操作包...

c 中的移位操作 填坑系列

首先需要明確一點,計算機中的二進位制數都是用其補碼表示的,所有的移位運算都是在補碼的表示形式上進行操作的,無符號數的補碼是其本身,有符號數的補碼是符號位不變,其他位求反加1。這裡說的很清楚。左移 高位移出,低空位補0。相當於乘以2的n次方 當左移一定位數時,最高位變為1,這時計算機會認為這是乙個負數...