Re: [問題] 問一題面試的題目...

看板C_and_CPP作者 (我愛阿蓉)時間16年前 (2010/02/04 23:29), 編輯推噓10(10032)
留言42則, 8人參與, 最新討論串3/4 (看更多)
誰可以解釋一下... int main() { int *a, *b; a = (int*)0x5566; b = (int*)0x5570; printf("%d\n", a-b); return 0; } 印出來是什麼東西阿= =完全無法理解.... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.192.105.166

02/04 23:33, , 1F
就印出了a b之間差了幾個int*啊.
02/04 23:33, 1F

02/04 23:33, , 2F
不過我也是現在才發現, 不滿int*的, 它會直接進位@_@"
02/04 23:33, 2F

02/04 23:34, , 3F
對不起更正一下, 是差了幾個int, 不是差int*....Orz
02/04 23:34, 3F

02/04 23:36, , 4F
試著 a=(int*)0x1000; b = a + 3; 印出b的位址....
02/04 23:36, 4F

02/04 23:37, , 5F
然後你就可以倒著知道為什麼 a-b是-3, 或b-a是3....:)
02/04 23:37, 5F

02/04 23:37, , 6F
不過剛好一樣4byte(大部分平台啦) 真巧
02/04 23:37, 6F

02/05 00:29, , 7F
意思是說其實是差2.5 但是他補足3 而且是小減大 自己變-3?
02/05 00:29, 7F

02/05 00:29, , 8F
那這樣算offset有啥意義呢 不足還被偷捕...不能單純只是位址
02/05 00:29, 8F

02/05 00:29, , 9F
相減嗎? 這種有什麼應用價值嗎
02/05 00:29, 9F

02/05 00:30, , 10F
答案是-10??
02/05 00:30, 10F

02/05 00:31, , 11F
你隨便拿兩個數塞給pointer然後期待它們減出什麼有意義
02/05 00:31, 11F

02/05 00:31, , 12F
的結果??
02/05 00:31, 12F

02/05 00:32, , 13F
想我工作時, 會要一塊CMD Buf, 然後依狀況寫進CMD Buf,
02/05 00:32, 13F

02/05 00:33, , 14F
最後我拿CMD Buf被寫到的位址去減一開始的頭, 就知道我
02/05 00:33, 14F

02/05 00:33, , 15F
真正要送出去的CMD Buf有幾個DWORD, 這時候我code就會有
02/05 00:33, 15F

02/05 00:34, , 16F
dwCmdCount = pCmdEnd-pCmdBegin; 那個dwCmdCount就有用
02/05 00:34, 16F

02/05 00:35, , 17F
了; 如果我寫了奇怪的byte數進CMD Buf, 就等著炸啦XD
02/05 00:35, 17F

02/05 00:36, , 18F
So, 也許你不要直接看這麼減有什麼意義, 而反過來想想什
02/05 00:36, 18F

02/05 00:36, , 19F
麼情況你有機會用到它:)
02/05 00:36, 19F

02/05 00:37, , 20F
不然, 指標相減就是offset而已, 雖然不足數的結果讓人玩
02/05 00:37, 20F

02/05 00:37, , 21F
味就是了XD
02/05 00:37, 21F

02/05 01:08, , 22F
只是個普通的undefined behavior XD
02/05 01:08, 22F

02/05 01:20, , 23F
QQ29: 其實也不用想成 -2.5 被補成 -3 啦,其實就 0x5566
02/05 01:20, 23F

02/05 01:21, , 24F
-0x5570=fff6 然後編譯器傻傻除以4 (VC是減完右移2 bits)
02/05 01:21, 24F

02/05 01:22, , 25F
=> fffffffd (-3)
02/05 01:22, 25F

02/05 01:25, , 26F
有道理, 推樓上XD
02/05 01:25, 26F

02/05 01:26, , 27F
所以如果是0x5570-0x5566的位址出來反而是2囉XD
02/05 01:26, 27F

02/05 01:40, , 28F
@@ 2 和3 絕對值就差1了耶 相減至少絕對直要一樣才是阿...
02/05 01:40, 28F

02/05 03:08, , 29F
用VC是2沒錯啊,減法做完右移2bits
02/05 03:08, 29F

02/05 08:39, , 30F
了解
02/05 08:39, 30F

02/05 09:41, , 31F
QQ29, 請你仔細咀嚼 UNARYvvv 大上面的推文好嗎~_~
02/05 09:41, 31F

02/05 09:41, , 32F
如果想看到絕對值相等, 改用short*或char*就看得到了XD
02/05 09:41, 32F

02/05 10:13, , 33F
@@ 我是不懂算offset的意義 因為我沒這樣用過
02/05 10:13, 33F

02/05 10:13, , 34F
不過就感覺 大減小 出來的 和 小減大 出來的不一樣
02/05 10:13, 34F

02/05 10:14, , 35F
就覺得很奇怪 對算offset就更不懂用意了
02/05 10:14, 35F

02/05 11:33, , 36F
你要想成這裡 compiler 幫你補了一個除法
02/05 11:33, 36F

02/05 11:34, , 37F
int x=0x5566,y=0x5570; printf("%d %d",(x-y)/4,(y-x)/4);
02/05 11:34, 37F

02/05 11:34, , 38F
大概像是這種感覺 所以那個差別就是除法的捨去誤差了
02/05 11:34, 38F

02/05 11:35, , 39F
也就是這裡的減不單單只有減還有除 偏偏問題正好在除上
02/05 11:35, 39F

02/05 11:40, , 40F
C的指標跟array是一體兩面, 這個要用array想
02/05 11:40, 40F

02/05 11:41, , 41F
指標減指標就是求差幾個element
02/05 11:41, 41F

02/05 13:26, , 42F
喔喔 剛想想 正常情況都會整除= = 傻了
02/05 13:26, 42F
文章代碼(AID): #1BQkVMqC (C_and_CPP)
文章代碼(AID): #1BQkVMqC (C_and_CPP)