TITLE:
面对char 首先想到的是,一个字节,8个比特位,伴随char的除了0~255这个范围外还有-128~127 这两个数字,来记录一下自己的理解
char占一个字节,再二进制表示中值域为:0000 0000
~1111 1111 ,十进制数就是0~255
如果把char类型当作有符号类型,需要把最高位当作符号位,实际能表示大小的位置只有7个二进制位
2^7=128,但是范围是 -128~127 不够对称,这里面还有细节
先来看正数:
正数要求符号位为0 剩下7位
最小为 0:二进制:0 000 0000
最大为 127: 二进制: 0 111 1111
对于负数,我们从0开始向下退,(从原码开始推)
正数0的下一位为负数,符号位为1
二进制:1 000 0000 (源码),然后呢,乍一看,第一个1代表负号,后面数值大小为0,所以这个数应该是 -0 ,,哈哈哈,但是这样是错的
不急、我们再往下推一个
二进制: 1 000 0001 (原码),最高位为1代表负号,数值大小为1 ,所以这个数为 -1
再推一个
二进制: 1 000 0010 (原码),这个数为 -2
最后。。。
二进制: 1 111 1111 (原码),这个数为 -127 (
在理解了这个之后,我们再来介绍 -0 -128 这两个奇奇怪怪的东西
1.原码反码补码理解
我靠,刺激,,,关于-128的原反补码,我们不要局限于1一个字节,放在 int(或者两个字节) 里面来看看,别有洞天。
但是char类型只有8个比特位,所以会将高位截除,所以截除之后:
造成了 -0 和 -128 的原码一样的假象!,,所以不是规定-0不存在,应该就是本来就不存在,
理解应该上了一个层次。
稍微扩展,
如果要在 signed char 里面硬塞进去 -129 ,解决方法一样,从大的字节来,然后对高位进行截除。