
go語言寫了一段代碼,為什么一個位元組的有符號位與無符號位 計算后的結果不一樣
一、計算機是如何存盤資料的
在計算機中,存盤一個數的時候,都是以補碼的形式存盤的
正數:正數的補碼就等于它的原碼
例如:16 原始碼:?0001 0000? 補碼:0001 0000? //這就是計算機最終存盤的資料
負數:負數的補碼是原碼除符號位以外都取反,然后 + 1 得來的
例如: -16 原始碼:1 001 0000 // 計算機在處理負數時最高位代表符號位 所以 最高位的1為 負號 反碼:1 110 1111 //符號位不變 其他資料位取反 補碼:1 110 1111+1=1 111 0000 //反碼+1=補碼 這就是計算機最終存盤的資料
二、有符號與無符號
無符號:其最高位的1或0,和其它位一樣,用來表示該數的大小,
一個位元組(1111 1111) 1111 1111=1*2^7+1*2^6+1*2^5+1*2^4+1*2^3+1*2^2+1*2^1+1*2^0=255;所以無符號的一個位元組表示的資料范圍是0~255 共 256個;在Go語言中 uint8 范圍(0~255)
例如:100 無符號表示:01100100
有符號:最高數稱為“符號位”,為1時,表示該數為負值,為0時表示為正值,一個位元組(0111 1111) 最高位的0表示正號,0111 1111=+111 1111=+(1*2^6+1*2^5+1*2^4+1*2^3+1*2^2+1*2^1+1*2^0)=+127
例如:100 有符號表示:01100100 //最高位0 表示 +號, 后七位才是具體資料位
對于有符號數的運算,一律采用補碼進行;把減法運算轉為加法運行 例如 5-3=5+(-3)
5 補碼:0000 0101 -3 補碼:1111 1101 相加: 10000 0010 // 由于我們是8位bit運算,我們丟棄溢位位1 最后 是 0000 0010=2
計算:5-7=5+(-7)=-2
5 補碼:00000101 -7 補碼:11111001 相加: 11111110 (由于符號位為1 所以改數為補碼) 反碼: 11111101 // 補碼-1 原始碼: 10000010 // 反碼除符號位以外取反
對于有符號位的0
原始碼:1000 0000
反碼:1111 1111
補碼:1 0000 0000 //去掉溢位位1后 0000 0000
所以對于0 如果采用8bit位 我們規定就用0000 0000 表示,用1000 0000 表示-128
最后我們手動計算該代碼

1 原始碼: 0 000 0001
1 補碼: 0 000 0001
127原始碼: 0 111 1111
127補碼: 0 111 1111
1補碼+127補碼=1000 0000 由于我們程式采用8bit位有符號型別,所以該結果是-128
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/17659.html
標籤:其他
上一篇:Python 元組
