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) |