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

小可尼の博客

Linux后端的技术窝窝

 
 
 

日志

 
 

关于unsigned与signed的转换问题  

2012-10-12 09:18:48|  分类: 计算机的基础知识 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

出处:http://topic.csdn.net/u/20110314/10/1d8fbc47-5794-4ffe-a31f-d94e3e63d22d.html

 

1.无论int是unsigned还是signed,如果int转化为char,均截取最低8位作为char的值
2.例如
(1)如果char为signed
char c;
int i=193;
c=i;
printf("%d\n",c);//输出-63,因为-63为193的补

过程:因为计算机存储的是数的补码所以:

193的二进制为:1100,0001

printf("%d\n",c);这句发生了char---->int 的变化所以发生了C语言中的无符号扩展和带符号扩展

 

扩展的原则是:
1.有符号的数据类型,在向高精度扩展时,总是带符号扩展
2.无符号的数据类型,在向高精度扩展时,总是无符号扩展

补码:

一个数如果为正,则它的原码、反码、补码相同一个数如果为负,则符号位为1,其余各位是对原码取反,然后整个数加1。

 

i=193  其补码 1111,1111,1111,1111,1111,1111,1100,0001

所以再将其转换为实际的数,先方法将符号位保留,

 

      已知一个负数的补码,将其转换为十进制数,步骤:
      1、先对各位取反;
      2、将其转换为十进制数;
      3、加上负号,再减去1。

 

1111,1111,1111,1111,1111,1111,1100,0001---->1000,0000,0000,0000,0000,0000,0011,1110

----->-62-1=-63


(2)如果char为unsigned
unsigned char c;
int i=193;
c=i;
printf("%d\n",c);//输出193

过程:因为计算机存储的是数的补码所以:

193的二进制为:1100,0001

printf("%d\n",c);这句发生了char---->int 的变化所以发生了C语言中的无符号扩展和带符号扩展

原则同上:

0000,0000,0000,0000,0000,0000,1100,0001---->0000,0000,0000,0000,0000,0000,1100,0001----->=193

 

 

 

其它例子出处:http://blog.sina.com.cn/s/blog_6057ff53010142z1.html

 

                                            C语言中的无符号扩展和带符号扩展

 

C语言中,当不同类型的数据进行运算的时候,就会发生强制或隐式类型转换,通常是低精度的数据类型扩展到高精度的。有些时候,低精度的位数比较少,扩展到高精度的时候,就要在前面补充一些位。那么这些位是补0还是补1呢?这就涉及到无符号扩展和带符号扩展。


  扩展的原则是:
1.有符号的数据类型,在向高精度扩展时,总是带符号扩展
2.无符号的数据类型,在向高精度扩展时,总是无符号扩展

 


  怎么理解呢?首先来看一道题目,按此题目讲解完你就明白了!
  char ca=128;
  unsigned char ucb=128;
  unsigned short usc=0;
  1)usc=ca + ucb;
  printf("%x",usc);
  2)usc=ca +(unsigned short)ucb;
  printf("%x",usc);
  3)usc=(unsignedchar)ca + ucb;
  printf("%x",usc);
  4)usc=ca+(char)ucb;
  printf("%x",usc);
  问,在1、2、3、4这4种情况下分别输出什么?
  分析:


  1)对于char类型,有符号,128的二进制是 1000 0000,已经溢出了,第一位会被当成符号位,也是就是说此时它是负数了,它扩展成unsigned short时,带符号扩展,符号位为1,所以在前方补1,结果是1111 1111 1000 0000。ucb类型为nsigned char,无符号,二进制是1000 0000,扩展成unsigned short时,无符号扩展,所以补0,结果是0000 0000 1000 0000,相加结果为 1 0000 0000 0000 0000 由于unsigned short是二字节,舍弃最前面的1,所以得到0x0;


  2)情况和1一样,只是将ucb显示强制转换为unsigned short,所以得到0x0;


  3)ca先强制转换为unsignedchar,仍然是1000 0000,注意此时转换后已经是一个无符号数,所以再往unsigned short 扩展时,为无符号扩展,结果为0000 0000 1000 0000,ucb扩展后也是0000 0000 1000 0000,相加结果为 0000 0001 0000 0000,所以结果为0x100;


  4)ca转为unsigned short,带符号扩展,为1111 1111 1000 0000,ucb先强制转换为char,然后再转为unsigned short,此时也要带符号扩展,所以也是1111 1111 1000 0000,两数相加,得到 1 1111 1111 0000 0000 ,所以结果为0xff00。

 


 

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

历史上的今天

评论

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

页脚

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