c語言int型和char型的自動型別轉換

2022-05-18 04:32:16 字數 2670 閱讀 2828

char a = -1; //

機器碼為0xff

unsigned char b = 254; //

機器碼0xfe

if (a <=b)

else

上述**輸出結果: a > b

賦值用機器碼寫入記憶體

雖然我們以十進位制為兩個變數賦值,但是變數值在記憶體中是以二進位制機器碼的形式存在。如果十進位制數是負數,它就以補碼的形式存放在記憶體中。比如"a = -1",a的真值以二進位制表示為"1000 0001",高位是符號位,其餘位表示絕對值;它的反碼是"1111 1110",補碼是"1111 1111",所以記憶體中某個存放變數a的位元組的數是0xff。而正數的補碼就是原碼,不需要轉換,所以記憶體中某個存放變數b的位元組的數是0xfe。(有關機器碼和補碼知識請戳

執行時不同型別變數的比較存在型別轉換

當正在比較的兩個變數型別不同時,會發生型別轉換。有符號char型和無符號char型比較時,有符號臨時轉換成無符號(機器碼不變,只是編譯器處理這個變數的方法改變)。a臨時轉成無符號後機器碼仍然時0xff,但是編譯器把它作為無符號處理——即沒有符號位,取值範圍時[0, 255],所以臨時變數值是255,自然比b大。

那麼字元型和整型變數發生型別轉換時需要注意哪些呢?

一位元組「字元型」 -> (轉換為)四位元組「整型」,位元組數較少的字元型變數會向高位擴充套件,具體補『0『還是補』1『,根據字元型變數自身型別和高位符號兩者決定。下面看四個例子。

例一:

char a = 0xff

;unsigned b = 0xffffffff

;if (a ==b)

else

上述**輸出結果:equal.即補『1』.

例二:

char a = 0xff

;int b = 0xffffffff

;if (a ==b)

else

上述**輸出結果:equal.即補『1』.

例二和例乙隻有變數b的型別不同,由此看出向高位址補位的動作不受要轉向的那個型別所影響。

例三:

unsigned char a = 0xff

;unsigned b = 0xffffffff

;if (a ==b)

else

上述**輸出結果:not equal.。即補『0』。

例三和例乙隻有變數a的型別不同,由此看出

向高位址補位的動作受變數本身型別所影響。

例四:

char a = 0x7f

;unsigned b = 0xffffffff

;if (a ==b)

else

上述**輸出結果:not equal.。即補『0』。

例四和例乙隻有變數a的值不一樣,例四中變數a的高位是0,因此向高位補『0』,由此有符號型向高位址補位的動作受變數符號位的值所影響。

而四位元組「整型」 

-> (轉換為)

一位元組「字元型」 ,就是單純地把低位一位元組的內容賦值給字元型變數。

char型資料溢位情況

char a = 64

;a *= 2

;if (a >= 0

)else

上述**輸出結果:a < 0。

雖然以十進位制數『128』賦值給變數,但實際存入記憶體中的機器碼是0x80,編譯時以有符號字元型處理這個位元組。這個值符號位是『1』,表示負數,對其餘位求補碼——結果換算成十進位制,並加負號,就是這個機器碼的真值,即『-128』。所以小於『0』。例子中雖然0x80在乙個位元組所能表示的數值範圍內,但是超過char型所能表示的正數範圍,這是char型資料溢位的乙個例子。

unsigned char型資料溢位情況

unsigned char a = 128;do

while (a <= 256)

上述**會不停迴圈。

當變數a從0x80乘2後,機器碼是0x100。由於『a』只能儲存乙個位元組的資料,所以取結果的低位一位元組,即0x00,這樣從0 -> 255 -> 0迴圈下去。這是unsigned char型資料溢位的乙個例子。

另外舉乙個誤把unsigned char型當作負數處理地例子,雖然不可能發生,但有必要了解一下其中原因:

unsigned char a = 0x0a;do

while (a >= 0)

上述**會不停迴圈。

當變數a從0x0自減後,機器碼是0xff。因為計算機運算中把減法當作兩數的補碼相加來做,(0 - 1)表示式在計算機運算中解釋為(0x0 + 0xff),所以結果是0xff。

最後舉乙個char型最小負數取相反數溢位的例子:

char a = -128

;char b = -a;

if (b > 0

)else

上述**輸出結果:b <= 0。

|a|的真值用二進位制表示"1000 0000",用補碼表示同樣是"1000 0000",最後由於是負數,高位置為『1』,結果是"1000 0000",這個0x80的char型機器碼的特殊之處在於符號位同時表示數值。『b』被編譯器處理為-128,所以輸出"b <= 0"。

char 型陣列Int型互轉

include include typedefunsignedcharuchar typedefunsignedintuint 轉換函式 temp 字元型陣列 pout int型陣列 length 字元型陣列的長度 這裡假設字元型陣列裡包含的都是偶數個元素 如果是奇數個數,則需要增加如下處理 檢查l...

關於int型和char型之間的轉換

我們將乙個整型變數賦值給乙個char型變數的話,就是將相應的ascii碼值的字元送入s變數 ascii碼 48 代表 0 ascii 1 代表笑臉 ascii碼 0 代表 0 於是char s 1 我們得到的將是笑臉 char s 48 我們得到 0 char s 0 我們得到 0 當我們需要得到乙...

C語言將int型別存入char型

最近在做演算法題的時候遇到了乙個問題,就是怎麼將int型別的值變成當成字串 字元陣列 型別,例如 有個 int 1024,如何將整形的1024轉為字串型別 string 的1024或者字元陣列 char 型別的1024呢?其實可以用itoa函式來實現這個功能。itoa是廣泛使用的非標準c語言和c 語...