看板 C_and_CPP 關於我們 聯絡資訊
short n=12 n的二進位值為 0000000000001100 ~n運算後變為 1111111111110011 問題 為何1111111111110011在十進位是 -13 short範圍-32768到32767 我覺得應該是很靠32767的一個值 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.249.232.13 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1435159855.A.A87.html
kdjf: 32767=b0111111111111111喔 06/24 23:37
softseaweed: 補數可把第一個bit當做sign bit, 1代表負 0代表正 06/24 23:37
softseaweed: 況且那串不會很靠近32767,2^15就32768,後面還一串 06/24 23:40
mater2004: 32767為何是0111111111111111阿? 有什麼規則定的嗎? 06/24 23:45
mater2004: 我剛算了一下 這樣就是-13 頭怎不是從000000000000000 06/24 23:47
mater2004: 開始呢 06/24 23:47
softseaweed: 你知道二進位怎麼做的嗎? 位值記數法? 06/24 23:47
mater2004: 不知道 剛看不久而已 06/24 23:49
softseaweed: 那你先把位值記數法跟二進位搞懂後再來看補數... 06/24 23:51
mater2004: 我不懂你說的是什麼? google找不太到,如果是計算轉換 06/24 23:56
mater2004: 我會。 06/24 23:58
softseaweed: 你會轉換怎麼會不知道為何32767=b0111111111111111 06/25 00:05
softseaweed: 簡而言之 二補數不用想太多 最左邊的bit若是1該數 06/25 00:07
softseaweed: 就是負的,若是0該數就是零或正的 06/25 00:07
softseaweed: 若是正數或零就跟一般二進位一樣換算即可 06/25 00:09
softseaweed: 負數請先NOT過後加1就會得到相對應的二進位值 06/25 00:10
softseaweed: 換算該值後在前面加上一個減號就是你要的數字了 06/25 00:10
softseaweed: 正數轉負數也是NOT過後+1 06/25 00:12
mater2004: 我知道我哪裡弄錯了,你還告訴我另一個東西。謝謝 06/25 00:14