C語言中不同型別的運算和比較問題

2021-10-05 06:49:32 字數 1920 閱讀 5104

今天寫**的時候遇到這樣一種情況:

首先我能獲取到乙個配置的電壓資訊,型別是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 ...