程序员C语言中,当不同类型的数据进行运算的时候,就会发生强制或隐式类型转换,通常是低精度的数据类型扩展到高精度的。有些时候,低精度的位数比较少,扩展到高精度的时候,就要在前面补充一些位。那么这些位是补0还是补1呢?这就涉及到无符号扩展和带符号扩展。
; [4 s, f. p+ X# z* [ 扩展的原则是:1.有符号的数据类型,在向高精度扩展时,总是带符号扩展
- w! e3 m9 P6 |) `2 g 2.无符号的数据类型,在向高精度扩展时,总是无符号扩展
% I7 N8 _3 |# @, z! h/ `/ Z 怎么理解呢?首先来看一道题目,按此题目讲解完你就明白了! , r8 E: l7 w' t; T0 x* d( [
charca=128;
# j4 K: a. ?* Y1 g! u unsignedcharucb=128;
/ l# R# k8 P- r1 B$ x2 G5 { unsignedshortusc=0; 0 h/ m1 X. g+ R" `* z N/ o
1)usc=ca+ucb;
! W1 ~- s3 D, ]* y C9 [: C printf("%x",usc);
C) K8 a( @, ~- i8 ?) _5 d 2)usc=ca+(unsignedshort)ucb; 9 r; c. K2 W" X, j. Q% U! O8 m
printf("%x",usc);
0 z% Y0 Q0 E+ r' p7 }" I& N* A* p 3)usc=(unsignedchar)ca+ucb;
% P9 a. G& [! ~0 \! u printf("%x",usc); , O% m& X/ _6 v9 j: }
4)usc=ca+(char)ucb;
7 O1 O1 S; r0 ~" \1 P$ H printf("%x",usc);
; Z+ @0 |% S5 W; K! J 问,在1、2、3、4这4种情况下分别输出什么? ) x" p3 T: J: S! g2 ~7 _ Y" k
分析: - ^: O# c7 `# p* H4 s* v$ ~
1)对于char类型,有符号,128已经溢出了,其二进制是10000000,第一位会被当成符号位,也是就是说此时它是负数了,它扩展成unsignedshort时,带符号位扩展,符号位为1,所以在前方补1,结果是111111111000000.ucb类型为nsignedchar,无符号,二进制是10000000,扩展成unsignedshor,无符号扩展,所以补0,结果是0000000010000000,。相加结果为10000000000000000由于unsignedshort是二字节,舍弃最前面的1,所以得到0x0,
% X4 M, k5 |! e, T/ V 2)情况和1一样,只是将ucb显示强制转换为unsignedshort,所以得到0x0,
$ G# [' `$ U6 Y5 ^ j( i 3)ca先强制转换为unsignedchar,仍然是10000000,注意此时转换后已经是一个无符号数,所以再往unsignedshort扩展时,为无符号扩展,结果为0000000010000000,ucb扩展后
7 a. Y! l: o2 Y 也是0000000010000000,相加结果为0000000100000000,所以结果为0x100 4)ca转为unsignedshort,带符号扩展,为111111111000000,ucb先强制转换为char,然后再转为unsignedshort,此时也要带符号扩展,所以也是111111111000000,两数相加,得到11111111100000000,所以结果为0xff00 |