計算機底層存儲數據時,存儲的是數據對應的二進制數字。對于整型數據,其二進制表示形式有三種,分別是:原碼、反碼、補碼,而實際存儲的是整型數據的補碼。
原碼、反碼以及補碼都是有符號的,其中最高位存放符號位,0 表示正數,1 則表示負數。
1. 原碼:
最高位表示正負,其余位表示數值。例如十進制的正負 1,用 8 位二進制的原碼表示:
+1 = [0000 0001]原,-1 = [1000 0001]原
2 .反碼:
正數的反碼和原碼相同;負數的反碼是在原碼的基礎上,符號位不變,其余位按位取反。
+1 = [0000 0001]反,-1 = [1111 1110]反
3. 補碼:
正數的補碼和原碼也相同;負數的補碼是在反碼的基礎上加 1。
+1 = [0000 0001]補,-1 = [1111 1111]補
有符號整數轉換
有符號負整數
十進制轉二進制:求-5的補碼,過程如下:-5對應正數5(00000101)→所有位取反(11111010)→加1(11111011),所以-5的補碼是11111011。數0的補碼表示是唯一的。
二進制轉十進制:給定一個有符號二進制數11111011,先減去1等于11111010,再取反10000101,得到的十進制數為-5
有符號正整數
十進制5對應的二進制為:0000 0101
這不會有任何的變化
校驗時當成無符號數,讀取數據時轉換成有符號數,程序中先定義u16,再轉換s16
u16 IMU16800_DATA[10];
checksum += (( IMU16800_DATA[i] >> 8) + ( IMU16800_DATA[i] & 0x00ff )); pAdis16800->gx = -(double)((s16)IMU16800_DATA[1])
手冊說了校驗就是無符號數,但是數據實際的意義是有符號的
In these cases, use the following formula to verify the 16-bit
checksum value, treating each byte in the formula as an
independent, unsigned 8-bit number: