關於陣列兩個元素位址相減的問題

2022-05-09 21:02:51 字數 534 閱讀 3702

#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 

00416b92  mov         dword ptr [ntmp],eax 

原來,執行完陣列位址相減運算後,還會執行算數右移指令,右移位數視引數型別而定,如int型右移2位,short型右移1位。都知道右移1位相當於除以2操作,右移2位等同於除以4。

由此可見,兩個陣列元素位址相減,實際是獲取兩個元素陣列元素的距離,而不是位址的距離。如果要計算位址距離,就直接強制型別轉換:int ntmp = (char*)&a[4] - (char*)&a[0];

關於陣列兩個元素位址相減的問題

昨天筆試也有這麼道題目,int arraytmp 10 int ntmp arraytmp 4 arraytmp 0 問ntmp 當時想也沒想寫了ntmp 16 回家在機器上調試執行了一下,結果ntmp 4。因為不常用這種方法,所以覺得很納悶兒。看了下反彙編的 發現 int ntmp arraytm...

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...