iT邦幫忙

0

C# 補數問題

該問題有點白痴...但真的搞不懂概念,還請各位大大鞭小力點。
事情是這樣的...
int a = 60//10進制
b = ~a //取a的補數
輸出->-61
實在真的不知道-61怎來的
印象中的補數是
step1. 61 (10) = 0011 1100 (2)
step2.取補數 1變0,0變1 -> 1100 0011(2)
step3. 1100 0011 (2) 最高位元1為負 -> -64(10) !? 還是我有誤會什麼Q__Q

0
koro_michael
iT邦新手 4 級 ‧ 2021-04-06 11:33:50
最佳解答

補數反轉後還要加上1

===================

我去看了一下 C# 的手冊,~運算子取的是 1 補數,也就是你說的直接反轉,並沒有加上 1

int 是 32位元,60 轉換後為

1111 1111 1111 1111 1111 1111 1100 0011

但是反轉後最高位是 1 ,那就得要用 2 補數的方法來看(負數)

2 補數反轉,先減去 1 ,結果為

1111 1111 1111 1111 1111 1111 1100 0010

再把所有位元反轉

0000 0000 0000 0000 0000 0000 0011 1101

答案就是 61

也就是以下這一串二進位值代表的就是 -61

1111 1111 1111 1111 1111 1111 1100 0011

sam22345 iT邦新手 5 級 ‧ 2021-04-06 11:35:50 檢舉

大大好~ 可是加上1後應該也是-63...怎會是-61 Q_Q

sam22345 我去看了一下 C# 的手冊,~運算子取的是 1 補數,也就是你說的直接反轉,並沒有加上 1

int 是 32位元,60 轉換後為

1111 1111 1111 1111 1111 1111 1100 0011

但是反轉後最高位是 1 ,那就得要用 2 補數的方法來看(負數)

2 補數反轉,先減去 1 ,結果為

1111 1111 1111 1111 1111 1111 1100 0010

再把所有位元反轉

0000 0000 0000 0000 0000 0000 0011 1101

答案就是 61

也就是以下這一串二進位值代表的就是 -61

1111 1111 1111 1111 1111 1111 1100 0011

sam22345 iT邦新手 5 級 ‧ 2021-04-07 10:26:37 檢舉

了解~感謝大大提供意見~

0
wrxue
iT邦新手 1 級 ‧ 2021-04-06 12:03:50

請先搞懂 ~ 在程式中的作用
~a 等同取 a 的 1'complement
(a)+(~a)會等於-1
所以 (~a) = -1 - a

sam22345 iT邦新手 5 級 ‧ 2021-04-07 10:26:50 檢舉

感謝大大提供意見QQ

1
小魚
iT邦大師 1 級 ‧ 2021-04-06 19:10:09

第一個1顯示出來就是負號.
如果是unsigned就會變成是很大的數.

舉例以前2 bytes的int 是 32767~-32768,
36767再加1就會變成是-32768.
-1 unsigned就會變成是65535.

sam22345 iT邦新手 5 級 ‧ 2021-04-07 10:26:55 檢舉

感謝大大提供意見QQ

0
mttso
iT邦見習生 ‧ 2021-04-07 08:04:17
sam22345 iT邦新手 5 級 ‧ 2021-04-07 10:27:00 檢舉

感謝大大提供意見QQ

0
camabula
iT邦新手 5 級 ‧ 2021-04-07 11:35:10

經過"~"運算之後是1補數
但是電腦是用2補數看待資料

step1. 61 ₍₁₀₎ ≠ 0011 1100 ₍₂₎

以一個byte來舉例
-61₍₁₀₎要怎麼表示?

  1. 要先用正數61換成二進制: 61₍₁₀₎=0011 1101₍₂₎
  2. 然後取2補數: 亦即~運算(1補數)之後再加1,1100 0010₍₂₎ + 0000 0001₍₂₎ = 1100 0011₍₂₎

這也就是為什麼

int a = 60//10進制 = 0011 1100₍₂₎
b = ~a //取a的補數 = 1100 0011₍₂₎ = -61₍₁₀₎
輸出->-61

的原因了!!

我要發表回答

立即登入回答