代碼如下:
for(INT 32 i =0; i < 39; i++)
{
sum += data[10+ii];
}
sum是UINT16
data是UINT8[0xFF]
這個data前面還進行了一些賦值操作。
問題:conversion to‘UINT16’ from 'int' may alter its value
我想問的怎么會出現int?是不是隱式轉換導致的?怎么解決這個問題?
uj5u.com熱心網友回復:
應該是隱式型別提升了:C語言中比int小的整型(包括short 、unsigned short 、 unsigned char和char)在運算中都要轉換成int然后進行運算,至于為什么選擇轉換為int,應該是從效率上考慮的,因為通常情況下int的長度被定義為機器處理效率最高的長度,比如32位機上,一次處理4個位元組效率是最高的,所以雖然short(我機器上占2個位元組)更節省記憶體,但是在運算中的效率,是int更高。所以上面,無論是邏輯運算a>b還是算術運算a+b中a和b都默認轉換成了int,所以算術運算的結果也是帶符號的。注意標紅的前提條件
uj5u.com熱心網友回復:
但是還需要注意一個問題就是轉換成int型別的時候,高位補齊的問題。
如果是unsigned的型別轉換成int型別,高位補0.
如果是signed的型別轉換成int型別,如果原來最高位是1則補1,如果是0則補0。
uj5u.com熱心網友回復:
不同的編譯器可能對字面量的型別存盤不一樣,可以參考以下鏈接https://zh.wikipedia.org/wiki/字面常量_(C語言)
對于你的代碼,i < 39 的 39 編譯器都當做是int,所以自動把 i 轉成 int 來比較
對于上面鏈接的,如果 39 轉成long,有另一種寫法,即 39L(后面帶個L表示long)能很容易做到,但是做成UINT16或UINT8好像沒有專門的修飾,這種情況只能強行轉換了,如 i < (UINT16)39
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/173570.html
標籤:C語言
