char类型细节

这里讲的是在c++环境中,char表示的长度为8bit。

首先char是有符号的字符类型;范围是-128~127之间;这里讨论下它的溢出,int到char,char到int之间过程;涉及计算机存储问题补码存储。

第一:计算存储以补码存储原因是减法计算可以变成补码加法计算(数以8bit为例)

例如:1-2=-1

1的补码是00000001;2的补码是00000010;-1的补码是11111111;减法操作先对2进行取反形成-2的补码即为11111110;接着相加如下

  00000001

+11111110

———————

  11111111

由此得到了-1。

想象下要是原码这样,则就是如下:

  00000001

+10000010

 ———————

  10000011显然是为-3不是-1则不对,故而直接存储原码则必须增加一个减法操作。

第二:关于10000000的补码

通过符号位保持不变,其余取反后,接着整个加1得到值为:1|00000000,显然截取后为00000000也就是和0的补码一致,按理应该是0值,也就是说0值对应着2个补码;可是为了是资源充分利用,系统规定了10000000的值表示为-128而不是表示0。也就是让10000000的补码为10000000而不是00000000。

第三:溢出问题

1:int到char的截断问题

比如char c=128;//产生溢出值的范围出错

这个128超出了char范围自动用是int来存储的,被char类型截断后为10000000,记住我们计算机存储方式是补码存储,则就是说它的原码才是我们显示的值,用刚第二说的,则对应着-128;同理如c=129则补码存储为10000001则相应原码是11111111表示-127(注意补码的补码就是原码)。

2:char到int的转换问题

例如:char c=127;//补码存储则为全1

int i=c+1;

结果是128;

分析:先将c转换为int类型了故而char看不到溢出效果;

3:char到int的溢出问题

char c=256;//溢出了整个字节了出错==本质和1情况一样原理

int i=c;

显示为0;

 

 

posted @ 2014-04-21 12:15  miner007  阅读(327)  评论(0编辑  收藏  举报