计算机基础部分 数据转换 移位问题

26 篇文章 0 订阅

 

unsigned long i;  /* unsigned long 类型为4字节*/
char c1=0xa4;
char c2=0x31;
i = c2<<8 | c1;
问:i =          (用16进制格式)   

如果:
unsigned long i; /* unsigned long 类型为4字节*/
char c1=0x74;
char c2=0x31;
i = c2<<8 | c1;
问:i =             (用16进制格式)

第一个等于 0xff ff ff a4
第二个等于 0x31 74

 

 这是为什么呢? 请看下面。。。

 

===========================   关于符号扩展  ===========================

相关知识点:1、低数据类型 向 高数据类型转换。2、高数据类型 向 低数据类型转换

一、短数据类型扩展为长数据类型

1、要扩展的短数据类型为有符号数的

      进行符号扩展,即短数据类型的符号位填充到长数据类型的高字节位(即比短数据类型多出的那一部分),保证扩展后的数值大小不变。

     在扩展成16位或者32位的时候,扩展位的值是1还是0是由char的符号位来决定的。

例子:char 类型在C语言里面占8位即1字节,符号位看最高位(第八位);short类型在C语言里面占16位即2字节。

    1:char x=10001001b;   short y=x;  则y的值应为11111111 10001001b;

           // x 是 char 型有符号的,并且x 的最高位(即符号位)是1,所以 x 赋值给y时,扩展位全补1(即1111 1111) 。

    2:char x=0000 1001b;   short y=x;  则y的值应为00000000 00001001b;

         // x 是 char 型有符号的,但符号位是0,所以 x 赋值给y时,扩展位全补0(即0000 0000) 。

2、要扩展的短数据类型为无符号数的

     进行零扩展,即用零来填充长数据类型的高字节位

例子:

     1:unsigned char x=10001001b;   short y=x;  则y的值应为00000000 10001001b;

          // x 是 unsigned char 型无符号的,所以扩展位全补0(即0000 0000) 。

    2:unsigned char x=00001001b;   short y=x;  则y的值应为00000000 00001001b;

           // x 是 unsigned char型 无符号的,所以扩展位全补0(即0000 0000) 。

二、长数据类型缩减为短数据类型

    如果长数据类型的高字节全为1或全为0,则会直接截取低字节赋给短数据类型;如果长数据类型的高字节不全为1或不全为0,则转会就会发生错误。

三、同一长度的数据类型中有符号数与无符号数的相互转化

     直接将内存中的数据赋给要转化的类型,数值大小则会发生变化。另短类型扩展为长类型时,但短类型与长类型分属有符号数与无符号数时,则先按规则一进行类型的扩展,再按本规则直接将内存中的数值原封不动的赋给对方。

具体请看:http://blog.csdn.net/qq506124204/article/details/7880666

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值