昨天筆試也有這麼道題目,
int arraytmp[10] = ;
int ntmp = &arraytmp[4]-&arraytmp[0];
問ntmp = ?
當時想也沒想寫了ntmp = 16;
回家在機器上調試執行了一下,結果ntmp=4。因為不常用這種方法,所以覺得很納悶兒。看了下反彙編的**,發現:
int ntmp = &arraytmp[4] - &arraytmp[0];
00416b87 lea eax,[ebp-28h]
00416b8a lea ecx,[arraytmp]
00416b8d sub eax,ecx
00416b8f sar eax,2
00416b92 mov dword ptr [ntmp],eax
原來,執行完陣列位址相減運算後,還會執行算數右移指令,右移位數視引數型別而定,如int型右移2位,short型右移1位。都知道右移1位相當於除以2操作,右移2位等同於除以4。由此可見,兩個陣列元素位址相減,實際是獲取兩個元素陣列元素的距離,而不是位址的距離。如果要計算位址距離,就直接強制型別轉換:int ntmp = (char*)&arraytmp[4] - (char*)&arraytmp[0];
關於陣列兩個元素位址相減的問題
includeint a 5 main 執行結果 檢視反彙編的 發現 int ntmp a 4 a 0 00416b87 lea eax,ebp 28h 00416b8a lea ecx,arraytmp 00416b8d sub eax,ecx 00416b8f sar eax,2 00416b9...
c c 兩個指標變數位址的相減
如下例程 include stdio.h include string.h using namespace std define uint8 t unsigned char define uint16 t unsigned short int define uint32 t unsigned int...
C 兩個無符號數相減的問題
因為乙個裸機軟定時器的溢位問題,static uint32 t timer ticks 0 void timer ticks void soft timer loop else target timeout cb 為了解決這個bug,有人可以把判斷條件換成 if int uint32 t targe...