C语言 unsigned 和 signed 类型相互转换深入理解

C语言 unsigned 和 signed 类型相互转换深入理解

  转载请注明出处 http://www.cnblogs.com/stonehat/archive/2011/10/14/2212141.html
复制代码
  转载请注明出处 http://www.cnblogs.com/stonehat/archive/2011/10/14/2212141.html
#include <stdio.h>
int main(int argc, char *argv[])
{
unsigned char a = -1;
char b = a;
printf("%d %d",a,b);

return 0;
}
//结果:255  -1
复制代码
复制代码
#include <stdio.h>
int main(int argc, char *argv[])
{
unsigned short a = -1;
short b = a;
printf("%d %d",a,b);

return 0;
}
//结果:65535 -1
复制代码

这是两段很简单的代码,我就以第二段代码为例。

     在计算机中,负数是以补码来存储的。  转载请注明出处http://www.cnblogs.com/stonehat/archive/2011/10/14/2212141.html

      C语言中常量整数 -1的补码表示为0xFFFFFFFF。截取后面16位FFFF赋值给 变量a(unsigned short)。此时 a = 0xFFFF(a没有符号位,0xFFFF转换为十进制为65535)

      a又将0xFFFF,直接赋值给short b。 此时 b = 0xFFFF(但是要注意,b是有符号的,0xFFFF转换为十进制为-1)

执行printf("%d %d",a,b);的时候,要将 a和b的值先转换为int型:

 a没有符号所以转为int型为0x0000FFFF,

 b有符号转换为int型为0xFFFFFFFF。

十进制输出值 65535  -1.   转载请注明出处http://www.cnblogs.com/stonehat/archive/2011/10/14/2212141.html

复制代码
#include <stdio.h>
int main(int argc, char *argv[])
{

unsigned int a = -1;
int b = a;
printf("%d %d",a,b);

return 0;
}
//结果 -1 -1
复制代码

转载请注明出处http://www.cnblogs.com/stonehat/archive/2011/10/14/2212141.html
a在内存中值为0xFFFFFFFF,b的值为0xFFFFFFFF,都已经32位,

a转换为int型的时候就是0xFFFFFFFF,所以输出-1.

其实,记住两点就行了

1.unsigned 类型转换为 signed类型的时候是直接复制到低位,高位为0.如果signed类型位数不够,只直接装载unsigned低位。

 2.signed类型转换为unsigned类型的时候,也是将补码直接复制到低位,高位为符号位。如果unsigned位数不够,只直接装载signed低位。

 转载请注明出处http://www.cnblogs.com/stonehat/archive/2011/10/14/2212141.html
转载请注明出处:http://www.cnblogs.com/stonehat/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值