Int 二进制
int 类型默认是有符号的,最高位 0 表示 正数, 1 表示负数。 例如:
5 的二进制:0101 ;
-5的二进制:1101 ;
原码、补码 反码 理解:
a、原码:一个正数,按照绝对值大小转换成的二进制数;一个负数按照绝对值大小转换成的二进制数,然后最高位补1,称为原码 比如:
5 的原码 : 0101 ;
-5的原码: 1101 ;
b、反码:正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。
5 的反码 : 0101 ;
-5的反码: 1010 ;
c、补码:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1.(即反码 +1)
5 的补码: 0101 ;
-5的补码:1011 ;
主要知识点:
①正数的反码和补码都与原码相同。
②而负数的反码为对该数的原码除符号位外各位取反。
③负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1
③ 补码的补码为原码
Int 二进制相加 或 相减
计算原理:
a、减法 可以视为 +负数来处理,所以整体可视为 两个数相加减法
b、二进制相加 一般是以补码的形式相加,将最终结果在取补码 : X(补) + Y(补) = Z(补); X 表示十进 制转成的二进制,Y表示十进制转成的二进制,Z 表示两个二进制相加后的结果,符号位也进行计算,超出位数舍弃(比如X,Y一个3位,一个5位,最终结果Z应该是5位,注意此处涉及到溢出问题,下面会讲到)。
c、例如 4 + 3 = 7 可视为: 0100 + 0011 = 0111 ( 7 )
d、注意 两个数字相加时 应保持二进制的位数相同,位数不够时在符号位之后添加0补齐。
二进制相加溢出问题:
a、按照(1)中所讲的计算原理:当计算 (-6) + (-2) = -8 时: -6 的原码–>反码–>补码:1110–>1001–>1010, -2的原码–>反码–>补码:110–>101–>110, 为保持和-6的二进制一样位宽,因此2的原码–>反码–>补码:1010–>1101–>1110;两个补码相加结果为:11000,结果的位数比原先的多出了一位,此处最左边的1,是会被自然丢弃的(就是不要了)。再看结果,对1000求补码(其实可以看出它就是0)。这和我们想要的-8有天壤之别。原因是这里出现了溢出!!!
b、溢出的定义: 那上面-2-6为例,即1110 + 1010,两个二进制相加时把每个的第一位数(红色字体)相加取其进位数(1+1 进位数是1) 和每个的第二位数相加