[問題] 一個面試考古題

看板C_and_CPP作者 (XYX)時間13年前 (2011/08/04 12:45), 編輯推噓7(7049)
留言56則, 9人參與, 最新討論串1/1
題目是說不用if ?: switch 等的judgement statement 判斷a,b兩數誰比較大 看到的解答code如下 int main() { int a = 3; int b = 5; int c = a - b; char *str[2] = {"a is bigger", "b is bigger"}; printf("unsigned is:%d\n", (unsigned)c); printf("unsigned is:%d\n", c); c = (unsigned)c >> (sizeof(int) * 8 - 1); printf("%s\n", str[c]); return 0; } 如以上這樣是沒有問題的 但我的問題在於為什麼把黃色的unsigned拿掉之後 他就不會正常輸出了 會跑出 『?" 』 但是 印出c 和 (unsigned)c 的值都一樣是-2呀 在2's complement 中負數第一位是1 所以理應往右shift 31位後得到的數字是1 結果應該要一樣不是嗎? 請問哪裡出了問題呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.4.181

08/04 12:52, , 1F
印出二進位來看看吧 http://pastie.org/2318034
08/04 12:52, 1F

08/04 13:00, , 3F
這個網頁可能有幫助
08/04 13:00, 3F

08/04 13:12, , 4F
超哥,我把位元數從32改成64.使用unsigned的,前32位元是0
08/04 13:12, 4F

08/04 13:14, , 5F
目前我只知道unsigned代表是正數.有網頁或是超哥親自講
08/04 13:14, 5F

08/04 13:14, , 6F
解一下嘛<m.m>
08/04 13:14, 6F

08/04 13:16, , 7F
我寫成 unsgined long 就正常了 (long長度是8 bytes)
08/04 13:16, 7F

08/04 13:17, , 8F
不過我也不知道為什麼
08/04 13:17, 8F

08/04 13:18, , 9F
unsigned的話 右移左邊會補0 但是signed的話 右移左邊會
08/04 13:18, 9F

08/04 13:19, , 10F
補上sign bit,所以負數會補1,正數會補0
08/04 13:19, 10F

08/04 13:19, , 11F
像是 shr 指令跟 sar 指令的差別
08/04 13:19, 11F

08/04 13:29, , 12F
謝謝suhorng
08/04 13:29, 12F

08/04 13:31, , 13F
為什麼沒有謝謝我 XD
08/04 13:31, 13F

08/04 13:36, , 14F
感謝兩位的幫忙!!
08/04 13:36, 14F

08/04 13:46, , 15F
謝謝james732
08/04 13:46, 15F

08/04 14:02, , 16F
補一下, suhorng 說明應是以 2's 系統為主。
08/04 14:02, 16F

08/04 14:02, , 17F
Primer 4e p155 指出,"若運算元為 signed,可插入 sign
08/04 14:02, 17F

08/04 14:03, , 18F
bit複件或其值為0之bits," "「取決於編譯器作法」"
08/04 14:03, 18F

08/04 14:43, , 19F
其實我有一部分就是苦惱在編譯器作法.不然我也不會追問
08/04 14:43, 19F

08/04 14:44, , 20F
下去.但是suhorng的想法應該是一種好解釋.
08/04 14:44, 20F

08/04 15:17, , 21F
藉機問一下, machine dependent和取決於編譯器是一樣意
08/04 15:17, 21F

08/04 15:20, , 22F
嗎? 因為我的 c primer plus(英文版)是這樣寫的
08/04 15:20, 22F

08/04 15:28, , 23F
我覺得machine dependent,應該是取決於OS,例如:win or
08/04 15:28, 23F

08/04 15:29, , 24F
unix.但是我沒看英文版的習慣.看看其他人怎麼說吧
08/04 15:29, 24F

08/04 15:32, , 25F
08/04 15:32, 25F

08/04 15:35, , 26F
machine d~,之前我視作 CPU d~ (可能有誤),至於 primer
08/04 15:35, 26F

08/04 15:36, , 27F
那裡敘述這段時.若你只看到 machine d~,代表後面還沒看
08/04 15:36, 27F

08/04 15:47, , 28F
感謝 angleevil 和 tropical, 看來這詞比我想像中指涉到
08/04 15:47, 28F

08/04 15:47, , 29F
更多東西
08/04 15:47, 29F

08/04 18:41, , 30F
抱歉...我都沒看過標準或C++ Primer,純粹是自己反組譯看指
08/04 18:41, 30F

08/04 18:41, , 31F
令整理...
08/04 18:41, 31F

08/04 19:00, , 32F
TAT 看來又要苦苦研究一番. 我的感覺是取絕不同平台造成
08/04 19:00, 32F

08/04 19:01, , 33F
的不同.也就是OS的不同造成編譯器用不同方式處理
08/04 19:01, 33F

08/04 19:04, , 34F
我覺得這個知道就算了,一些程式我也都用su~的假設在寫
08/04 19:04, 34F

08/04 19:07, , 35F
幹嘛不這樣用: printf("%s\n", str[a<b]);
08/04 19:07, 35F

08/04 19:08, , 36F
比較運算的結果是int,數值只會是0或1,這是標準規定
08/04 19:08, 36F

08/04 19:11, , 37F
對了,如果a-b會造成underflow,即使是2's系統也會gg
08/04 19:11, 37F

08/04 19:12, , 38F
!! 我又看到驚艷的碼了,真的是沒想到.
08/04 19:12, 38F

08/04 20:49, , 39F
等等,str是char array,這樣要怎麼比大小.可以麻煩
08/04 20:49, 39F

08/04 20:50, , 40F
littleshan講解一下嗎? 我只知道a<b的值非0即1.但是
08/04 20:50, 40F

08/04 20:51, , 41F
為何這樣可以比?
08/04 20:51, 41F

08/04 20:51, , 42F
printf("%s\n", str[a<b]); 其實還有隱式轉換一次
08/04 20:51, 42F

08/04 20:58, , 43F
@angleevil:那是 array of pointer to char,不是
08/04 20:58, 43F

08/04 20:58, , 44F
char array.
08/04 20:58, 44F

08/04 21:00, , 45F
(array of pointer to string 會好點嗎? XD )
08/04 21:00, 45F

08/04 21:06, , 46F
~"~其實那個細節可以之後慢慢討論.我最好奇是為何
08/04 21:06, 46F

08/04 21:07, , 47F
可以取代judgement statement.我有點想不通卻又很想學
08/04 21:07, 47F

08/04 21:07, , 48F
請成全新手的我再度進步Orz
08/04 21:07, 48F

08/04 21:08, , 49F
它只是要a<b的話puts(str[0]); !(a<b)的時候puts(str[1]);
08/04 21:08, 49F

08/04 21:08, , 50F
的效果
08/04 21:08, 50F

08/04 21:11, , 51F
...拍謝,我犯糊塗了...我沒看原po的文章.對.這樣就可
08/04 21:11, 51F

08/04 21:12, , 52F
Orz.
08/04 21:12, 52F

08/04 22:56, , 53F
http://codepad.org/0QZpxAGT <--其實後來想想,&1
08/04 22:56, 53F

08/04 22:58, , 54F
就可以.因為我只記得左移的位元有規定補零,
08/04 22:58, 54F

08/04 22:59, , 55F
右移的位元可0可1.
08/04 22:59, 55F

08/06 10:22, , 56F
好好學ASM~
08/06 10:22, 56F
文章代碼(AID): #1EEYFMVp (C_and_CPP)