a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 91|回复: 0

[程序员] 2012年软件水平初级资格程序员考试重点知识17

[复制链接]
发表于 2012-8-2 08:51:15 | 显示全部楼层 |阅读模式
程序员C语言中,当不同类型的数据进行运算的时候,就会发生强制或隐式类型转换,通常是低精度的数据类型扩展到高精度的。有些时候,低精度的位数比较少,扩展到高精度的时候,就要在前面补充一些位。那么这些位是补0还是补1呢?这就涉及到无符号扩展和带符号扩展。
! c& P$ O! ^! h% r  扩展的原则是:1.有符号的数据类型,在向高精度扩展时,总是带符号扩展 3 x! H* h" X4 g" `' |* _4 T! x% {
  2.无符号的数据类型,在向高精度扩展时,总是无符号扩展 : _+ Y7 ^1 U- u9 [- |4 I
  怎么理解呢?首先来看一道题目,按此题目讲解完你就明白了! 0 ?6 J& t! ]) R! t: h6 [, A
  charca=128; 7 T$ Z6 f, j% A$ d& K+ i5 q
  unsignedcharucb=128;
; j7 A' K0 a2 t8 H2 M) X  unsignedshortusc=0; ' F( Q7 k7 j1 C$ E! e! z: s
  1)usc=ca+ucb;
+ j1 J# u; _" k5 `' d( M+ Q  printf("%x",usc);
1 ?# `& [4 s( Z. F# i  2)usc=ca+(unsignedshort)ucb;
5 m6 _/ r1 k; p/ @  printf("%x",usc);
' i/ Z# l  O  b( F$ M6 Q  3)usc=(unsignedchar)ca+ucb;
) O% n; F* Y( L4 }7 R1 c. m  printf("%x",usc); 0 H8 d. ~/ T7 v5 g/ |
  4)usc=ca+(char)ucb;
5 m7 |0 @1 ?- N+ R: L  printf("%x",usc);
5 w5 T6 k# l. T% U2 F6 s9 F, m+ g  问,在1、2、3、4这4种情况下分别输出什么? ( Y, L/ b/ G: P, n7 W% Q
  分析:
, Z6 r. _, `  z0 m* p. [% P; f, M  1)对于char类型,有符号,128已经溢出了,其二进制是10000000,第一位会被当成符号位,也是就是说此时它是负数了,它扩展成unsignedshort时,带符号位扩展,符号位为1,所以在前方补1,结果是111111111000000.ucb类型为nsignedchar,无符号,二进制是10000000,扩展成unsignedshor,无符号扩展,所以补0,结果是0000000010000000,。相加结果为10000000000000000由于unsignedshort是二字节,舍弃最前面的1,所以得到0x0,
! M2 s4 W( b9 S, w! ~' y  2)情况和1一样,只是将ucb显示强制转换为unsignedshort,所以得到0x0,
8 D: d* ^' e. g" h9 V  3)ca先强制转换为unsignedchar,仍然是10000000,注意此时转换后已经是一个无符号数,所以再往unsignedshort扩展时,为无符号扩展,结果为0000000010000000,ucb扩展后 - j( v5 d$ s2 k& j4 e* D
  也是0000000010000000,相加结果为0000000100000000,所以结果为0x100   4)ca转为unsignedshort,带符号扩展,为111111111000000,ucb先强制转换为char,然后再转为unsignedshort,此时也要带符号扩展,所以也是111111111000000,两数相加,得到11111111100000000,所以结果为0xff00
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-6-17 11:12 , Processed in 0.306648 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表