注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小可尼の博客

Linux后端的技术窝窝

 
 
 

日志

 
 

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

2012-10-11 23:19:39|  分类: 计算机的基础知识 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
出处:http://www.linuxso.com/linuxbiancheng/6105.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

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

     在计算机中,负数是以补码来存储的。 

      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.  

 

 #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

 

a在内存中值为0xFFFFFFFF,b的值为0xFFFFFFFF,都已经32位,

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

其实,记住两点就行了

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

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

  评论这张
 
阅读(451)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018