Bash
為什麼“$((~33))”產生-34?
$ 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。