關於char型變數的運算及其他

2021-06-22 02:31:43 字數 962 閱讀 7162

專案中遇到的問題,

將一幅影象二值化(0x00:黑色,0xff:白色),為判斷影象邊緣,需要判斷相鄰兩個畫素是否相反,影象的資料是uchar型的,開始**如下:

for(int j = 1; jwidth; j++)

}

h_count始終為0,也就是

if(tmp == ~data[i*step+j-1])
判斷永遠為假,列印出所有影象資料,發現有相鄰的0x00,0xff。這是什麼原因?半天不得其解。

原來是uchar型資料在進行操作符運算之前就已經進行了轉換,轉成int型的,運算的結果也是int型的,0x00先高位補零為:0x00 00 00 00,取反為0xffffffff,與0xff比較就出問題了,同理0xff在運算之前也是先自動轉換為int型,(注意不是強制轉換),0x00 00 00 ff,取反結果為:0xff ff ff 00.

下面是一些驗證:

int main()

如果乙個

運算子兩邊的運算數型別不同,先要將其轉換為相同的型別,即較低型別轉換為較高型別,然後再參加運算,轉換規則如下圖所示。

double ←── float 高

↑long

↑unsigned

↑int ←── char,short 低

● 圖中橫向箭頭表示必須的轉換,如兩個float型數參加運算,雖然它們型別相同,但仍要先轉成double型再進行運算,結果亦為double型。 縱向箭頭表示當運算子兩邊的運算數為不同型別時的轉換,如乙個long 型資料與乙個int型資料一起運算,需要先將int型資料轉換為long型, 然後兩者再進行運算,結果為long型。所有這些轉換都是由系統自動進行的, 使用時你只需從中了解結果的型別即可。這些轉換可以說是自動的,當然,c語言也提供了以顯式的形式

強制轉換型別的機制。

關於字元型char變數

寫程式時,意外發現個很不容易察覺問題出在哪的問題的 scanf c ch scanf c c printf ch c n ch printf c c n c 如果輸入是 a b 那麼輸出會是 ch a c 問題出在哪?如果將 改為 scanf c ch scanf c c printf ch c n...

關於C 中char 型變數的位址輸出

在剛開始學習c c 過程中,我們希望輸出各個變數的位址來窺探一些我們 百思不得其解 的現象,例如搞清函式堆疊相關的程式內部秘密。先看下面示例 將原始碼中 修改為 我們看到同樣作為char型的變數m char2輸出位址正常,修改為 為什麼會出現這樣現象,字串是以空終止符 0 結尾的字元陣列,通過字串中...

C 中的char型變數

最簡單的字元資料型別是 char 資料型別。該型別的變數只能容納乙個字元,而且在大多數系統上,只使用乙個位元組的記憶體。以下示例即宣告了乙個名為 letter 的 char 變數。請注意,這裡的字元常數就是賦給變數的值,要用單引號括起來。char letter a 下面的程式使用了乙個 char 變...