型別轉換和符號擴充套件,again

2021-07-25 20:24:11 字數 1340 閱讀 1623

舉例:

int i = 1; char ch; ch = (char)i;

注意:

一般用於截斷,除非你知道自己在做什麼,否則不要使用這種轉換;

舉例:

int i; char ch = 1; i = ch;

注意:

隱式型別轉換會導致資料型別擴充套件,於是引入符號擴充套件的問題

隱式型別轉換多出的bit用什麼值填充非常關鍵,乙個重要的前提是填充後不能改變原來的數值!

0000 0001 —> 0000 0000 0000 0001

1 —> 1

1000 0000 —> 1111 1111 1000 0000

-127 —> -127

可以看出,有符號型別在進行儲存位數擴充套件時填充最高位可保證不發生數值的改變,這種擴充套件又稱符號位擴充套件

0000 0001 —> 0000 0000 0000 0001

1 —> 1

1000 0000 —> 0000 0000 1000 0000

127 —> 127

可以看出,無符號型別在進行儲存位數擴充套件時填充0即可保證數值的一致,這種擴充套件又稱零擴充套件

型別提公升所表現出的零擴充套件和符號擴充套件本質上都是為了保證數值的一致性。

小技巧:

在處理網路資料的時候使用unsigned char而不是char,因為在使用%02x列印的時候不會出現煩人的ff。

int i;

char ch = 1;

i = ch;

//對應的彙編指令為:

0x00000000004004e1

<+11>: movb $0x1,-0x5(%rbp)

//ch = 1;

0x00000000004004e5

<+15>: movsbl -0x5(%rbp),%eax

0x00000000004004e9

<+19>: mov %eax,-0x4(%rbp)

//i = ch;

//可以看出在這裡使用的是movsbl (move signed byte to long),推測一下可以知道無符號的轉換應該就是movzbl (move zero byte to long)。

//另外說明一點,使用符號擴充套件還是零擴充套件取決於ch的型別,如果ch是有符號的,即使i是無符號的,也會使用movsbl指令,而不是movzbl。

格式符號 型別轉換

常用的格式符號 格式符號 轉換 輸出 號 s 字串 d 有符號十進位制整數 f 浮點數 c 字元 u 無符號十進位制整數 o 八進位制整數 x 十六進製制整數 小寫字母0x x 十六進製制整數 大寫字母0x e 科學計數法 小寫 e e 科學計數法 大寫 e g f和 e 的簡寫 g f和 e的簡寫...

符號擴充套件和截斷

符號擴充套件和截斷的幾點認識 1.符號擴充套件。short inta 4 short intb 8 print binary a print binary b unsigned short intc a 型別轉換 unsigned intd a print binary c print binary...

擴充套件類 型別轉換

using system using system.collections.generic using system.linq using system.text namespace xwp kz string 轉換 int 錯誤返回int 錯誤返回 error 成功返回 numb public s...