Chinaunix首页 | 论坛 | 博客
  • 博客访问: 11340
  • 博文数量: 16
  • 博客积分: 290
  • 博客等级: 二等列兵
  • 技术积分: 145
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-18 23:08
文章分类

全部博文(16)

文章存档

2011年(2)

2010年(14)

我的朋友

分类: C/C++

2010-12-25 00:44:23

 
1、演示代码

#include <stdio.h>

int main(void)
{
        char c1=126;
        char c2=128;
        char c3=130;
        char c4=256;
        char c5=259;
        char c6=387;

        int i=(int)c1;
        printf("int 126=1111110 assign to char c1,---> %d\n",i);

        i=(int)c2;
        printf("int 128=10000000 assign to char c2,---> %d\n",i);

        i=(int)c3;
        printf("int 130=10000010 assign to char c3,---> %d\n",i);

        i=(int)c4;
        printf("int 256=100000000 assign to char c4,---> %d\n",i);

        i=(int)c5;
        printf("int 259=100000011 assign to char c5,---> %d\n",i);

        i=(int)c6;
        printf("int 387=110000011 assign to char c6,---> %d\n",i);

        return 0;
}

 
 
2、分析
(1)i=(int)c3;
     printf("int 130=10000010 assign to char c3,---> %d\n",i);

“10000010”为8bit,最高位是1,表示是负数,从2'complement转换成原码(减1取反)是01111110=126,加上符号就是-126。
(2)i=(int)c5;
     printf("int 259=100000011 assign to char c5,---> %d\n",i);

“100000011”超过8bit,截取后8bit为00000011=3,很直观。
(3)i=(int)c6;
     printf("int 387=110000011 assign to char c6,---> %d\n",i);

是截断+补码的情况,结合1、2容易得出答案。
 
3、总结
(1)char型,默认是unsigned还是signed,和平台以及编译器有关,在x86和gcc环境中,char默认是signed char;signed char在x86平台用2'complement表示的。因此取之范围是-128~127.
(2)给char型变量赋值,如果超过了8bit,将截断,如例子中的256、259、387。
 

4、参考



阅读(1245) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~