以下内容为自学笔记缺乏严谨性,如有错误和不足请大佬指正
(1)-1的二进制为什么全1?
要回答这个问题首先要明白 原码 反码 补码
负数在计算机中都是以二进制补码(Complement)形式表示和存储的
原码: 原码就是符号位加上的绝对值,即用第一位表示符号(正0负1),其余真值位表示值
-1的原码就如上图一样
反码: 正数的反码就是他本身,负数的反码是在原码的基础上,符号位不变,其余各个位取反
-1的反码就是符号位1不变其他位取反
补码: 正数的补码就是他本身,负数的补码是在原码的基础上,符号位不变,其余各个位取反最后+1(既在反码的基础上+1)
-1的补码就是在反码的基础上+1变成全1如上图
因为负数在计算机中都是以二进制补码(Complement)形式表示和存储的
所以-1在计算机表示和存储的的形式就是全1
(2)什么是整形溢出现象?
上面这种情况就是整形溢出现象
比如char只能存储8bit这8位全是1再加1就变成了前面一个1后面8个0(100000000),而char只能存储8位前面那个多出来的1就会溢出被舍弃
(3)为什么有符号整形最大值+1反而最小值?
有符号整形最大值一定是第一位是0其余为1
以char类型举例
最大值 0111,1111
最大值+1 1000,0000
因为是有符号整形 符号位为1是负数,此时是他的补码
负数的原码就是补码的补码
补码的反码就是 1111,1111
正常来说他补码的补码应该是11000,0000舍弃最高位1为1000,0000 代表-0现在代表-128 因为没有-0这个数所以不冲突,不会影响计算。
但是可以求他的真值,就是将符号取出来后面的值+1也就是-(127+1) == -128 为char类型的最小值,求真值的方法其他的数也适用