有符号数据的符号位扩展
生活随笔
收集整理的這篇文章主要介紹了
有符号数据的符号位扩展
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
簡介:
在寫傳感器驅(qū)動(dòng)程序的時(shí)候經(jīng)常會遇到輸出數(shù)據(jù)位數(shù)在8到16位之間。這樣,在調(diào)試的時(shí)候如果使用printf直接輸出數(shù)據(jù),有可能出現(xiàn)錯(cuò)誤。因?yàn)閜rintf在打印的時(shí)候會做數(shù)據(jù)類型判斷。所以我們需要對數(shù)據(jù)做符號位擴(kuò)展。使用例子:
比如說現(xiàn)在有一個(gè)輸出為12位的加速度計(jì)數(shù)據(jù),最高位表示數(shù)據(jù)符號位。現(xiàn)在讀取X軸的數(shù)據(jù)(兩個(gè)8位寄存器)如下:所以我們需要一個(gè)16位有符號變量來存儲X軸的數(shù)據(jù),現(xiàn)定義一個(gè) int16_t data_x = 0;且data_x = ((OUT_X_MSB << 4) | (OUT_X_LSB >> 4));因?yàn)槲覀兌x的時(shí)候data_x是一個(gè)16位數(shù)據(jù),而加速度計(jì)實(shí)際有效數(shù)據(jù)是12位,所以data_x的高4位是偽數(shù)據(jù)。這是就需要進(jìn)行符號位擴(kuò)展了。 具體操作如下: if(printf_datax & (1 << 11)) ? // 12位有符號數(shù)據(jù)需要左移11
{
printf_datax |= 0xf000;
} 上面的操作是對有符號數(shù)據(jù)進(jìn)行符號擴(kuò)展的操作,通過給負(fù)數(shù)值“或1”實(shí)現(xiàn)的。或1的位域是除了有效數(shù)據(jù)之外的所有位域。
總結(jié)
以上是生活随笔為你收集整理的有符号数据的符号位扩展的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 树莓派上搭建Git服务器
- 下一篇: Protocol Buffer基本语法