char型別和short,int型別之類的轉換

2021-07-31 07:24:42 字數 1612 閱讀 9245

今天偶遇乙個printf輸出小問題,**如下:

#include#includeusing namespace std;

int main()

輸出:ffff

初次分析如下:以為char只有乙個位元組,所以& short之後,補上前面的乙個位元組ff,所以為ffff.

但換成 char a=0x0f  ,輸出的是f。

而換成 unsigned char 如下:

#include#includeusing namespace std;

int main()

輸出:ff

分析:直到嘗試無符號字元型,才想起來資料的範圍,char的範圍是-128~127,而unsigned char的範圍是0~255. 所以在做  char  & short(int) 操作或者直接使用printf(「%x」,a)時,會自動補位。printf(「%x」,a)可以輸出指定引數的16進製制形式,但是在實際的使用中,引數不一定都是32位的整數,有可能是16位的short,8位的char。所以它們在輸出%x時,會自動補位。而

補位的規則就是補符號位

,因為char 最大的正值為7f(127),超過就會溢位,變成負數,符號位為1,所以前面補ffffff(變成int ),而7f 前面符號位是0 ,所以補24個0之後,輸出7f。驗證下:

所以char 轉換成short ,int 都是同理,而short 轉換成int 時也是同理,補符號位,驗證如下:

所以在資料型別轉換時,一定要考慮資料範圍,以及有無符號

總結: 短位元組的型別 轉換成  長位元組的型別時, 高位自動補齊 符號位(全0 或者全1)。而 長位元組 轉換成 低位元組時,從低位元組開始取。char 的底層儲存是 整形的,所以 

unsigned char 可以做byte (0`255)使用

另外 移位運算也是補符號位,例如 1<<31>>31, 最後會編成 ffffffff,因為1<<31.是80ffffff,所以右移時,高位也是自動補了符號位1,而不是想當然的補0;而左移位自動低位補0。

這裡還要注意的是 : 比如int a=oxffff,這裡其實符號位還是0的,但如果short a=oxffff,那符號位就是1了。

CHAR型別和VARCHAR型別

char和varchar類似,僅僅是儲存和檢索方式不同。char型別和varchar型別宣告的長度表示你想要儲存的最大字元數。但是char型別的長度是不可變的,varchar型別的長度是可變的 定義乙個char 10 和varchar 10 如果存進去的是 abcd 那麼char所佔的長度依然為10...

char型別和string型別(C ,C

這一篇要講乙個非常重要的話題 char型別與string型別的區別。從字面上說,他們是有區別的 1.char是字元型別 2.string是字串型別 雖然一字之差,但其本質是很大的。2.string是乙個模板型別,也就是乙個class c 在c 中它屬於引用型別 reference type stri...

char型別和string型別的區別

也許有很多同學分不清這個char型別和string型別,區別到底在 一開始他們問我,差別在 我也不太說的清楚,貌似都是字串,貌似是字元,通過查閱資料,我對他們的區別有了進一步的了解。雖然一字之差,但是本質的區別很大。我們從c 與c 的角度來進行闡述一下。1.char是字元型別 屬於值型別 value...