Bash

為什麼“$((~33))”產生-34?

  • July 2, 2019
$ echo $(( 255 ))
255
$ echo $(( 33 ))
33
$ echo $(( ~33 ))
-34
$ echo $(( ~255 ))
-256
$ 

我的核心是:

$ uname -a
Linux HOSTNAME 3.2.0-40-generic-pae #64-Ubuntu SMP Mon Mar 25 21:44:41 UTC 2013 i686 i686 i386 GNU/Linux

問題: ~用於否定數字 AFAIK。但是為什麼~33產生-34,為什麼~255產生-256

bash 的手冊頁說:

  ! ~    logical and bitwise negation

有符號數通常以二進制補碼表示形式儲存:

...
-4 = 1100
-3 = 1101
-2 = 1110
-1 = 1111
0 = 0000
1 = 0001
2 = 0010
3 = 0011
...

這意味著如果你取一個像 2 這樣的數字,它會按位解釋為 0010。在按位取反之後,它變成 1101,它是 -3 的表示。

這是二進制補碼運算的結果。

~是一個按位求反,它反轉所有正在操作的位。二進制補碼運算通過反轉所有位並加 1 來工作。由於您只反轉了位,但沒有加一,所以您得到相同的數字,反轉後減一。

維基百科在這裡有一篇關於二進制補碼的好文章。

舉個例子:

  • 二進制中的 3 是0011
  • -3 在(二進制補碼)二進制是1101
  • 反轉0011給你1100,即 -4,因為你沒有加 1。

引用自:https://unix.stackexchange.com/questions/75196