程序員C語言中,當(dāng)不同類型的數(shù)據(jù)進(jìn)行運(yùn)算的時候,就會發(fā)生強(qiáng)制或隱式類型轉(zhuǎn)換,通常是低精度的數(shù)據(jù)類型擴(kuò)展到高精度的。有些時候,低精度的位數(shù)比較少,擴(kuò)展到高精度的時候,就要在前面補(bǔ)充一些位。那么這些位是補(bǔ)0還是補(bǔ)1呢?這就涉及到無符號擴(kuò)展和帶符號擴(kuò)展。
擴(kuò)展的原則是:1.有符號的數(shù)據(jù)類型,在向高精度擴(kuò)展時,總是帶符號擴(kuò)展
2.無符號的數(shù)據(jù)類型,在向高精度擴(kuò)展時,總是無符號擴(kuò)展
怎么理解呢?首先來看一道題目,按此題目講解完你就明白了!
charca=128;
unsignedcharucb=128;
unsignedshortusc=0;
1)usc=ca+ucb;
printf("%x",usc);
2)usc=ca+(unsignedshort)ucb;
printf("%x",usc);
3)usc=(unsignedchar)ca+ucb;
printf("%x",usc);
4)usc=ca+(char)ucb;
printf("%x",usc);
問,在1、2、3、4這4種情況下分別輸出什么?
分析:
1)對于char類型,有符號,128已經(jīng)溢出了,其二進(jìn)制是10000000,第一位會被當(dāng)成符號位,也是就是說此時它是負(fù)數(shù)了,它擴(kuò)展成unsignedshort時,帶符號位擴(kuò)展,符號位為1,所以在前方補(bǔ)1,結(jié)果是111111111000000.ucb類型為nsignedchar,無符號,二進(jìn)制是10000000,擴(kuò)展成unsignedshor,無符號擴(kuò)展,所以補(bǔ)0,結(jié)果是0000000010000000,。相加結(jié)果為10000000000000000由于unsignedshort是二字節(jié),舍棄最前面的1,所以得到0x0,
2)情況和1一樣,只是將ucb顯示強(qiáng)制轉(zhuǎn)換為unsignedshort,所以得到0x0,
3)ca先強(qiáng)制轉(zhuǎn)換為unsignedchar,仍然是10000000,注意此時轉(zhuǎn)換后已經(jīng)是一個無符號數(shù),所以再往unsignedshort擴(kuò)展時,為無符號擴(kuò)展,結(jié)果為0000000010000000,ucb擴(kuò)展后
也是0000000010000000,相加結(jié)果為0000000100000000,所以結(jié)果為0x100
4)ca轉(zhuǎn)為unsignedshort,帶符號擴(kuò)展,為111111111000000,ucb先強(qiáng)制轉(zhuǎn)換為char,然后再轉(zhuǎn)為unsignedshort,此時也要帶符號擴(kuò)展,所以也是111111111000000,兩數(shù)相加,得到11111111100000000,所以結(jié)果為0xff00
擴(kuò)展的原則是:1.有符號的數(shù)據(jù)類型,在向高精度擴(kuò)展時,總是帶符號擴(kuò)展
2.無符號的數(shù)據(jù)類型,在向高精度擴(kuò)展時,總是無符號擴(kuò)展
怎么理解呢?首先來看一道題目,按此題目講解完你就明白了!
charca=128;
unsignedcharucb=128;
unsignedshortusc=0;
1)usc=ca+ucb;
printf("%x",usc);
2)usc=ca+(unsignedshort)ucb;
printf("%x",usc);
3)usc=(unsignedchar)ca+ucb;
printf("%x",usc);
4)usc=ca+(char)ucb;
printf("%x",usc);
問,在1、2、3、4這4種情況下分別輸出什么?
分析:
1)對于char類型,有符號,128已經(jīng)溢出了,其二進(jìn)制是10000000,第一位會被當(dāng)成符號位,也是就是說此時它是負(fù)數(shù)了,它擴(kuò)展成unsignedshort時,帶符號位擴(kuò)展,符號位為1,所以在前方補(bǔ)1,結(jié)果是111111111000000.ucb類型為nsignedchar,無符號,二進(jìn)制是10000000,擴(kuò)展成unsignedshor,無符號擴(kuò)展,所以補(bǔ)0,結(jié)果是0000000010000000,。相加結(jié)果為10000000000000000由于unsignedshort是二字節(jié),舍棄最前面的1,所以得到0x0,
2)情況和1一樣,只是將ucb顯示強(qiáng)制轉(zhuǎn)換為unsignedshort,所以得到0x0,
3)ca先強(qiáng)制轉(zhuǎn)換為unsignedchar,仍然是10000000,注意此時轉(zhuǎn)換后已經(jīng)是一個無符號數(shù),所以再往unsignedshort擴(kuò)展時,為無符號擴(kuò)展,結(jié)果為0000000010000000,ucb擴(kuò)展后
也是0000000010000000,相加結(jié)果為0000000100000000,所以結(jié)果為0x100
4)ca轉(zhuǎn)為unsignedshort,帶符號擴(kuò)展,為111111111000000,ucb先強(qiáng)制轉(zhuǎn)換為char,然后再轉(zhuǎn)為unsignedshort,此時也要帶符號擴(kuò)展,所以也是111111111000000,兩數(shù)相加,得到11111111100000000,所以結(jié)果為0xff00