問題的提出:
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 ...
不要小看它們 這些能讓你越來越美
食鹽 除角質和油脂 用食鹽水洗臉有去除角質 收斂肌膚 改善潮紅肌膚的作用,還能清除 的油脂。惱人的 黑頭 用食鹽輕輕摩擦也能去除。油性 使用一星期左右,面部 會顯得更鮮嫩 透明。蜂蜜 抗衰老 防乾燥 蜂蜜是養生佳品,含有大量能被人體吸收的氨基酸 酶 激素 維生素及醣類成分,能促進 創面的癒合,抗衰老...