十六進(jìn)制如何代表負(fù)數(shù)(補(bǔ)碼舉例,計(jì)算,分析)
計(jì)算機(jī)中表示負(fù)數(shù)是用補(bǔ)碼.
其實(shí)計(jì)算機(jī)內(nèi)部的數(shù)據(jù),都是補(bǔ)碼形式存儲的.(遵循補(bǔ)碼形式的二進(jìn)制存儲)

比如下面一段文字,是我從一個電機(jī)的協(xié)議中摘出來的.(這里都是十六進(jìn)制表示方法:::)
1.下傳幀: 0xd8 0x30 0x10 0x00 0xff? //?代表控制電機(jī)轉(zhuǎn)速為0x1000=4096轉(zhuǎn)每分鐘.
2.下傳幀: 0xd8 0x30 0xf0 0x00 0xff? //? 代表控制電機(jī)轉(zhuǎn)速位0xf000=- 4096轉(zhuǎn)每分鐘.
從上面兩條指令中,0xd8 0x30可以認(rèn)為是包頭,不用管.
0xff是包尾,也不用管.
中間標(biāo)紅的是數(shù)據(jù)位.
可見,這個電機(jī)控制的數(shù)據(jù)只有兩個字節(jié).
關(guān)于第一條下傳幀,它的數(shù)據(jù)位是,0x10 0x00,合起來就是0x1000,然后我們打開window自帶的計(jì)算器:在HEX欄,也就是16進(jìn)制欄,輸入1000,

然后可以從對應(yīng)的DEC欄得到4096,DEC也就是10進(jìn)制的意思.

上面是正數(shù)的驗(yàn)證,得到0x1000就是4096.
這樣的方法是否適用于負(fù)數(shù)呢??看下圖,顯然是不行的.

因?yàn)檩敵龅氖M(jìn)制(DEC)是61440.
那么應(yīng)該如何去驗(yàn)證呢?
電機(jī)使用手冊上說0xf000= - 4096 ,手冊上說的例子,一般是不會錯的.

進(jìn)行負(fù)數(shù)的驗(yàn)證:
下面就會用到一定的計(jì)算機(jī)基礎(chǔ)了,這里的0xf000是補(bǔ)碼的形式.
人是不能直觀看清補(bǔ)碼的,需要轉(zhuǎn)換成原碼.
補(bǔ)碼如何轉(zhuǎn)換成原碼:
負(fù)數(shù)原碼和補(bǔ)碼的相互轉(zhuǎn)換:符號位不變,數(shù)值位按位取反,末位再加1。
我們用windows系統(tǒng)自帶的計(jì)算器,就可以進(jìn)行上面法則的運(yùn)算.
第一步:把計(jì)算器,調(diào)整到二進(jìn)制界面.

第二步:符號位不變,其他的按位取反.
(用鼠標(biāo)去右擊某一個二進(jìn)制位,就可以進(jìn)行取反,0變1,1變0)

第三步:末尾再加一.

通過上面的一步后,看到的結(jié)果是:36864.
難道0xf000=36864嗎?顯然不是.
之所以出現(xiàn)36864,是因?yàn)閣indows系統(tǒng)自帶的計(jì)算器不夠智能,
它不知道最高位的1代表負(fù)號,而是按照正整數(shù)進(jìn)行的計(jì)算.
所以,你需要自己去處理一下.
1001 0000 0000 0000 ,去掉最高位的符號位. (用鼠標(biāo)右擊最高位的1,使1變成0)

然后,就可以看到得到的是4096,
然后因?yàn)橛蟹?就是-4096.
即0xf000= -4096.

總結(jié):
計(jì)算機(jī)中的負(fù)數(shù),都是補(bǔ)碼形式的.