天天看點

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

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

今天偶遇一個printf輸出小問題,代碼如下:

#include<cstdlib>
#include<cstdio>
using namespace std;
int main()
{
 chara=0xff;
 printf("%x",a&0xffff);
 system("pause");
 return 0;
}
輸出:ffff
           
char類型和short,int類型之類的轉換

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

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

char類型和short,int類型之類的轉換
而換成 unsigned char 如下:
#include<cstdlib>
#include<cstdio>
using namespace std;
int main()
{
 unsigned char a=0xff;
 printf("%x",a&0xffff);
 system("pause");
 return 0;
}
輸出:ff
           
char類型和short,int類型之類的轉換

分析:直到嘗試無符号字元型,才想起來資料的範圍,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類型之類的轉換
char類型和short,int類型之類的轉換

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

char類型和short,int類型之類的轉換
char類型和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了。