不要小看 b a 4

2021-05-26 10:54:19 字數 1408 閱讀 3935

問題的提出:

unsigned char a=0xa5;

unsigned char b=~a>>4;

注意~優先順序高於》,按照邏輯b應該為0x05

而結果b=0xf5,有點不符合邏輯,反編譯(vc6,32位)看了一下,發現編譯器把上面的**編譯成

mov           ecx, dword ptr[ebp-8]      ;ecx = 0xcccccca5

and            ecx, 0ffh                               ;ecx = 0x000000a5

not            ecx                                        ;ecx = 0xffffff5a

sar             ecx, 4                                    ;ecx = 0xfffffff5(注意移位後用1補齊!!!)

mov           byte ptr [ebp-10h], cl       ;cl = 0xfff5

反思一下,為了完成b=~a>>4,編譯器做了三個工作

(1)申請了乙個32位的臨時變數x,將a擴充套件後,存入x

(2)將x取反

(3)將x右移4位,並將移位後x的低8位送給b

在第一步中,存在乙個是否按符號位擴充套件的問題,這裡a為unsigned型,不需要擴充套件,所以x = 0x000000a5;

若a為(signed) char型,則按符號位擴充套件後,x =0xffffffa5,取反後x = 0x0000005a,最終b=0x05。

下面在看一下關於符號位擴充套件的反編譯**

unsigned char a1 = 0xa5;

int a2 = a1;

這裡擴充套件不需要補1,應為a1是unsigned型別的,所以編譯器將上面**譯為

mov           byte ptr [ebp-4], 0a5h

mov           eax, dword ptr [ebp-4]

and            eax, 0ffh                                      ;eax = 0x000000a5

mov           dword ptr [ebp-18h], eax

對於下面的c**,需要進行符號位擴充套件

char a1 = 0xa5;

int a2 = a1;

反編譯後,可以看到一條movsx帶符號擴充套件指令

mov           byte ptr [ebp-4], 0a5h

movsx       eax,byte ptr [ebp-4]         ;eax = 0xffffffa5

mov           dword ptr [ebp-18h],eax

千萬不要小看office辦公軟體應該熟練掌握

今天應該提交比賽的申請文件了,被打回來了n次。當時我的心哇。碎的就剩粉末了。主要問題如下 時間不正確 格式不正確 1.時間不正確 因為使用的是別人的模板,時間還是n年前,但是寫完後好多地方都沒改過來於是。所以需要宣告時間的地方千萬不要吝嗇自己的眼力,多檢查幾次。2.格式不正確 字間距,行間距,字型大...

黑客系列知識之不要小看了ping命令

ping命令,大家都比較熟悉,它常被用來測試區域網的連通狀態。ping ip位址 是大家最常用的一種命令格式,但大家是否注意過ping命令中的ip位址呢?這裡面可是有很多學問和講究的,下面筆者就為大家介紹一下隱藏在ping命令中的這些秘密。0 可以有條件省略 大家常用 ping 127.0.0.1 ...

不要小看它們 這些能讓你越來越美

食鹽 除角質和油脂 用食鹽水洗臉有去除角質 收斂肌膚 改善潮紅肌膚的作用,還能清除 的油脂。惱人的 黑頭 用食鹽輕輕摩擦也能去除。油性 使用一星期左右,面部 會顯得更鮮嫩 透明。蜂蜜 抗衰老 防乾燥 蜂蜜是養生佳品,含有大量能被人體吸收的氨基酸 酶 激素 維生素及醣類成分,能促進 創面的癒合,抗衰老...