補數反轉後還要加上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
大大好~ 可是加上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
了解~感謝大大提供意見~
請先搞懂 ~
在程式中的作用~a
等同取 a
的 1'complement(a)+(~a)
會等於-1
所以 (~a)
= -1 - a
第一個1顯示出來就是負號.
如果是unsigned就會變成是很大的數.
舉例以前2 bytes的int 是 32767~-32768,
36767再加1就會變成是-32768.
-1 unsigned就會變成是65535.
經過"~"運算之後是1補數
但是電腦是用2補數看待資料
step1. 61 ₍₁₀₎ ≠ 0011 1100 ₍₂₎
以一個byte來舉例
-61₍₁₀₎要怎麼表示?
這也就是為什麼
int a = 60//10進制 = 0011 1100₍₂₎
b = ~a //取a的補數 = 1100 0011₍₂₎ = -61₍₁₀₎
輸出->-61
的原因了!!