这里讲的是在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;