点赞、关注+收藏,一起从0学会C语言!!!
计算机中所有数据都是以补码的形式存在的;
想知道补码,首先我们要了解原码
原码:
有符号整数的二进制编码方式,其中最高位表示符号位,0表示正数,1表示负数。其余位表示数值的绝对值。例如,+10的原码为0000 1010,-7的原码为1000 1010。
用代码理解:
都知道10的二进制=1010,但是为什么它的原码会是00001010呢
很好理解:
首先char是1个字节 ,八位;
而计算机中存储的数据单位=1字节=8位
这样我们就知道为什么会有八位了,而10的二进制=1010,所有前三位=0
首位=0是因为10是正数,正数=0,负数=1
int main()
{
char ch=10;
return 0;
}
总结:原码虽然转换方便,但不利于计算
反码:
反码特点:
正数情况下与原码的值不变
负数情况下,符号位不变,但其他部分取反(0变1,1变0)
用代码理解:
这时转换的值=10
原码=0000 1010;
反码=0000 1010;
int main()
{
char ch=10;
return 0;
}
这时,转换的值=-10
原码=1000 1010;
反码=1111 0101;
int main()
{
char ch2=-10;
return 0;
}
总结:反码并不利于计算,通常用来作为求补码的中间过渡。
补码:
在计算机系统中,数值一律用补码来存储
补码特点:
对于正数来说,原码、反码、补码皆相同
对于负数来说,其补码=它的反码加1
补码符号位不动,其他位求反,最后整个 数+1,得到补码
这时转换的值=10
原码=0000 1010;
反码=0000 1010;
补码=0000 1010;
int main()
{
char ch=10;
return 0;
}
这时,转换的值=-10
原码=1000 1010;
反码=1111 0101;
反码=1111 0111;(0101+1)
int main()
{
char ch2=-10;
return 0;
}
同时在计算机中,10=0a;
因此在代码中:
int main() {
char ch = 10;
printf("%p\n", &ch);
system("pause");
return 0;
}
它的结果=000000EB2EF3F5C4(每个计算机不同,所有值也会不同,现在以我的为例)
接下来看看内存中这个地址:
我们发现第一排的值=0a也就是10
计算:
在计算机系统中,数值一律用补码来存储,的主要原因是:
1.统一0的编码
2.将符号位和其他位统一处理
3.将减法运算转变为加法运算
4.两个用补码表示的数相加时,如果最高位(有符号位)有进位时,则进位被舍弃
通常我们写运算时减法比如76-32算的是减法,但是计算机是不会减法只会加法
所以计算机运算的方法是76+(-32)
76-32/76+(-32)
76:
原码:0100 1100
反码:0100 1100
补码:0100 1100
-32:
给个图(8421法则)计算过程:
原码:1010 0000
反码:1101 1111
补码:1110 0000
然后两者补码相加:
补码:0100 1100
补码:1110 0000
总补码:1(舍弃) 0010 1100
总反码:(正的不变)0010 1100;
总原码:(正的不变)0010 1100
所以4+8+32=44(8421法则)
现在再来个答案=负数的:
76-82
76:
原码:0100 1100
反码:0100 1100
补码:0100 1100
-82:
给个图加深印象:
原码:(负数=1)1101 0010
反码:1010 1101
补码:1010 1110
然后两者补码相加:
补码:0100 1100
补码:1010 1110
总补码:1111 1010
总反码:1111 1001(负数的补码是由反码+1得来的,所有反推要用补码-1)
总原码:1000 0110=-(2+4)=-6
这就是本次学习的所有内容,请大家多看多想,保持热情,最后C语言一定能学至成功