看板 C_and_CPP 關於我們 聯絡資訊
題目是說不用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
james732:印出二進位來看看吧 http://pastie.org/2318034 08/04 12:52
james732:這個網頁可能有幫助 08/04 13:00
angleevil:超哥,我把位元數從32改成64.使用unsigned的,前32位元是0 08/04 13:12
angleevil:目前我只知道unsigned代表是正數.有網頁或是超哥親自講 08/04 13:14
angleevil:解一下嘛<m.m> 08/04 13:14
james732:我寫成 unsgined long 就正常了 (long長度是8 bytes) 08/04 13:16
james732:不過我也不知道為什麼 08/04 13:17
suhorng:unsigned的話 右移左邊會補0 但是signed的話 右移左邊會 08/04 13:18
suhorng:補上sign bit,所以負數會補1,正數會補0 08/04 13:19
suhorng:像是 shr 指令跟 sar 指令的差別 08/04 13:19
angleevil:謝謝suhorng 08/04 13:29
james732:為什麼沒有謝謝我 XD 08/04 13:31
XYX16888:感謝兩位的幫忙!! 08/04 13:36
angleevil:謝謝james732 08/04 13:46
tropical72:補一下, suhorng 說明應是以 2's 系統為主。 08/04 14:02
tropical72:Primer 4e p155 指出,"若運算元為 signed,可插入 sign 08/04 14:02
tropical72:bit複件或其值為0之bits," "「取決於編譯器作法」" 08/04 14:03
angleevil:其實我有一部分就是苦惱在編譯器作法.不然我也不會追問 08/04 14:43
angleevil:下去.但是suhorng的想法應該是一種好解釋. 08/04 14:44
Minilogo:藉機問一下, machine dependent和取決於編譯器是一樣意 08/04 15:17
Minilogo:嗎? 因為我的 c primer plus(英文版)是這樣寫的 08/04 15:20
angleevil:我覺得machine dependent,應該是取決於OS,例如:win or 08/04 15:28
angleevil:unix.但是我沒看英文版的習慣.看看其他人怎麼說吧 08/04 15:29
angleevil:http://0rz.tw/aaJOf<--參考看看 08/04 15:32
tropical72:machine d~,之前我視作 CPU d~ (可能有誤),至於 primer 08/04 15:35
tropical72:那裡敘述這段時.若你只看到 machine d~,代表後面還沒看 08/04 15:36
Minilogo:感謝 angleevil 和 tropical, 看來這詞比我想像中指涉到 08/04 15:47
Minilogo:更多東西 08/04 15:47
suhorng:抱歉...我都沒看過標準或C++ Primer,純粹是自己反組譯看指 08/04 18:41
suhorng:令整理... 08/04 18:41
angleevil:TAT 看來又要苦苦研究一番. 我的感覺是取絕不同平台造成 08/04 19:00
angleevil:的不同.也就是OS的不同造成編譯器用不同方式處理 08/04 19:01
tropical72:我覺得這個知道就算了,一些程式我也都用su~的假設在寫 08/04 19:04
littleshan:幹嘛不這樣用: printf("%s\n", str[a<b]); 08/04 19:07
littleshan:比較運算的結果是int,數值只會是0或1,這是標準規定 08/04 19:08
littleshan:對了,如果a-b會造成underflow,即使是2's系統也會gg 08/04 19:11
tropical72:!! 我又看到驚艷的碼了,真的是沒想到. 08/04 19:12
angleevil:等等,str是char array,這樣要怎麼比大小.可以麻煩 08/04 20:49
angleevil:littleshan講解一下嗎? 我只知道a<b的值非0即1.但是 08/04 20:50
angleevil:為何這樣可以比? 08/04 20:51
loveme00835: printf("%s\n", str[a<b]); 其實還有隱式轉換一次 08/04 20:51
tropical72:@angleevil:那是 array of pointer to char,不是 08/04 20:58
tropical72:char array. 08/04 20:58
tropical72:(array of pointer to string 會好點嗎? XD ) 08/04 21:00
angleevil:~"~其實那個細節可以之後慢慢討論.我最好奇是為何 08/04 21:06
angleevil:可以取代judgement statement.我有點想不通卻又很想學 08/04 21:07
angleevil:請成全新手的我再度進步Orz 08/04 21:07
suhorng:它只是要a<b的話puts(str[0]); !(a<b)的時候puts(str[1]); 08/04 21:08
suhorng:的效果 08/04 21:08
angleevil:...拍謝,我犯糊塗了...我沒看原po的文章.對.這樣就可 08/04 21:11
angleevil:Orz. 08/04 21:12
angleevil:http://codepad.org/0QZpxAGT <--其實後來想想,&1 08/04 22:56
angleevil:就可以.因為我只記得左移的位元有規定補零, 08/04 22:58
angleevil:右移的位元可0可1. 08/04 22:59
StranGhost:好好學ASM~ 08/06 10:22