小知識 為什麼負數除二和右移一位的結果不一樣?

2021-07-09 05:37:07 字數 955 閱讀 8401

問題描述:

為什麼負數除二和右移一位的結果不一樣?

這是在vs2013,c#中

這是在cb中

也有一些編譯器,結果是一樣的,但是為什麼結果會是這樣呢?

究其原因,還得看看彙編**,在vs2013中提供了反彙編指令,結果如下

可以看到。

第一句:f = x / 2

00df39f7  mov         eax,dword ptr [ebp-58h]   ;將x的值移到暫存器eax

00df39fa mov ecx,2 ;將值2移到ecx

00df39ff cdq ;將eax高位擴充套件到edx

00df3a00 idiv eax,ecx ;做除法運算

00df3a02 mov dword ptr [ebp-50h],eax ;移動到記憶體

(關於idiv指令詳見二進位制除法)

第二句:g = x >> 1

僅僅是做乙個右移運算,所以如果最低位是1的話,就會被抹去。

總結:除法運算,結果都向0取整;位運算結果向下取整

為什麼要禁止除GET和POST之外的HTTP方法?

最近老是聽朋友說,被上級單位通報http不安全方法漏洞,本來是低危漏洞,也沒怎麼注意它,最近公升為中危漏洞,每天催著去整改,鬧得人心惶惶,甚至經常被維護人員吐槽,做的是得不償失的事情。因此,有必要說明一下,為什麼要禁止除get和post之外的http方法。換句話說,對於這些http不安全方法,到底有...

執行緒和程序小知識(二)

執行緒是程序內的執行單元 thread1.stop 不推薦使用,它會釋放所有的monitor 太暴力,一致性很難得到保證。thread1.interrupt void 中斷執行緒 thread1.isinterrupted boolean 判斷是否被中斷 thread1.interrupted st...

什麼是大端序和小端序,為什麼要有位元組序

位元組序,又稱端序或尾序 英語中用單詞 endianness表示 在計算機領域中,指電腦記憶體中或在數字通訊鏈路中,占用多個位元組的資料的位元組排列順序。在幾乎所有的平台上,多位元組物件都被儲存為連續的位元組序列。例如在 go 語言中,乙個型別為int的變數x位址為0x100,那麼其指標 x的值為0...