今天寫**的時候遇到這樣一種情況:
首先我能獲取到乙個配置的電壓資訊,型別是uint8
然後我要用當前的實際電壓與配置的電壓進行比較,
問題是 我獲取到的配置電壓單位是0.1v,當前實際電壓單位是0.01v
所以工需要將我獲取到的配置電壓 乘以 10,再和實際電壓進行比較,
我是這樣寫的:
if(currentv < (confi** * 10))/* confi** :配置電壓 currentv :實際電壓 */
那麼問題就來了,我的confi** 的型別是uint8,隨隨便便給它做了*10的操作,會不會溢位呢?
不知道。
實際寫**測試了一下,**如下:
int main(void)
else
return 0;
}
結果如下:所以這能證明真的沒有問題嗎?感覺並不能
好吧,去找書,看看c語言的祖宗書裡《the c programming language》有沒有相關的問題描述
果然沒讓人失望,還真有,書裡面是這樣描述的:
總結一下,如果有兩個不同型別的資料需要進行運算時,會進行型別提公升,
原則是從低往高轉, unsigned優先。
又問了大佬,大佬發給我這樣一段描述:
因此,從c語言的規則裡來看,我上面那樣寫**應該是沒有問題的,
因為操作符左右兩端的資料都被轉換成了 unsigned int 型別了,所以沒問題。
但是大佬又說,
如果這麼寫都要先確認編譯器完全按照規則寫了,
有些編譯器實際上會存在不滿足全部c特性的問題。
如遭重擊。。。
所以這個故事告訴我們,有這種情況還是自己強轉一下型別吧,否則出錯哭都不知道找誰哭。。。
例子1:
int a = -1;
unsigned int b = 1;
if(a > b)
else
當執行乙個運算時(如這裡的a>b),如果它的乙個運算數是有符號的而另乙個數是無符號的,那麼c語言會隱式地將有符號引數強制型別轉換為無符號數,並假設這兩個數都是非負的,來執行這個運算。
例子2:
int i = -12;
unsigned int j = 6;
//i+j 的值是多少?
printf("%u.\r\n",( ui+i ) ); // 無符號數解析:4294967290
printf("%d.\r\n",( ui+i ) ); // 有符號數解析:-6
例子3:
int i = -20;
unsigned int j = 10;
int k = 5;
if((i+j) > k)
else
例子4:
int i = -20;
unsigned int j = 10;
int k = -5;//此處和上面不同
if((i+j) > k)
else
C語言中不同型別變數的解讀
c語言中變數分為四類,分別是 四大類,所有變數必須先說明 定義 後使用。自動變數 區域性變數 區域性變數 在乙個函式開頭或段開頭處說明的變數,它有幾個特徵 include void print number int x,int y printf d n sum void main void 外部變數...
C語言中不同型別資料之間的賦值
整數與整數之間 一 長度相等 在記憶體中儲存的位數相等 的兩個不同的型別的資料之間的賦值 在計算機中的儲存內容不變,只是資料按照不同的編碼格式來解析。二 長賦值給短 短 長 擷取低位,然後按照短整數的資料型別解析。三 短賦值給長 長 短 其中,短轉長又分為三種情況 1.兩個資料都是無符號的資料,短整...
C語言合運算不同型別之間的混合運算
運算的兩個數中有乙個數為float或double型,結果為double型,因為系統將所有的float型資料轉換為double型別資料再進行計算。如果int型與float或double型資料進行計算,先把int型和float型資料轉換為double資料再進行計算,結果為double型。字元 char ...