亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 ^1 等于 -2?

為什么 ^1 等于 -2?

Go
白衣染霜花 2022-11-28 17:01:44
fmt.Println(^1)為什么打印這個-2?
查看完整描述

2 回答

?
30秒到達戰場

TA貢獻1828條經驗 獲得超6個贊

^運算符是按位補碼運算符。規范:算術運算符:

對于整數操作數,一元運算符+-^定義如下:

+x                          is 0 + x

-x    negation              is 0 - x

^x    bitwise complement    is m ^ x  with m = "all bits set to 1" for unsigned x

                                      and  m = -1 for signed x

所以1在二進制中是單個 1 位前面全是零:

0000000000000000000000000000000000000000000000000000000000000001

所以按位補碼是一個單獨的 0 位,前面是全 1:

1111111111111111111111111111111111111111111111111111111111111110

The^1是一個無類型常量表達式。當它被傳遞給一個函數時,它必須被轉換為一個類型。由于1是無類型整型常量int,因此將使用其默認類型。int在 Go 中使用2 的補碼表示,其中負數以 a 開頭1。完整的數字是-1,數字小一(二進制)是-2等等。

上面的位模式是 的 2 的補碼表示-2。

要打印位模式和類型,請使用以下代碼:

fmt.Println(^1)

fmt.Printf("%T\n", ^1)

fmt.Printf("%064b\n", 1)

i := ^1

fmt.Printf("%064b\n", uint(i))

它輸出(在Go Playground上試試):


-2

int

0000000000000000000000000000000000000000000000000000000000000001

1111111111111111111111111111111111111111111111111111111111111110


查看完整回答
反對 回復 2022-11-28
?
一只斗牛犬

TA貢獻1784條經驗 獲得超2個贊

好的,這與我們在計算中使用符號的方式有關。


對于一個 1 字節的數字,你可以得到


丁 乙

-8  1000

-7  1001

-6  1010

-5  1011

-4  1100

-3  1101

-2  1110

-1  1111

0 0000

1 0001

2 0010

3 0011

4 0100

5 0101

6 0110

7 0111

你可以在這里看到 1 等于 0001(沒有變化)但 -1 等于 1111。^運算符執行按位異或運算。所以:


0001

1111 xor

-------

1110 -> That is actually -2. 

所有這一切都是因為我們用來計算負數的兩個補碼的約定。當然,這可以外推到更長的二進制數。


您可以使用 Windows 計算器進行異或按位計算來對此進行測試。


查看完整回答
反對 回復 2022-11-28
  • 2 回答
  • 0 關注
  • 199 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號