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