什么是原码:所有数转化成二进制的序列就是原码【正数原反补相同】
什么是补码:原码通过取反得反码,反码+1得补码【负数存的是补码】
所有信息在计算机在内存中,都是由二进制方式存储
计算机自能进行加法运算
什么是原码,补码,反码呢?
他们之间是怎么相互转化的呢?
计算机是怎么实现5+3的?
计算机是怎么实现5-3的呢?
、、、
下面我们来详细讲解:
首先我们都知道
#include<stdio.h>
int main() {
printf("%d\n", sizeof(char));//1
printf("%d\n", sizeof(unsigned char));//1
printf("%d\n", sizeof(int));//4
printf("%d\n", sizeof(unsigned int));//4
printf("%d\n", sizeof(float));//4
printf("%d\n", sizeof(double));//8
return 0;
}
每一个字节=8个比特位【例如01010101就是八个比特位】
正文
int a=3电脑把3存进整型a,是记录的3吗?
首先,电脑是通过二进制存储信息,所以必然不是3;
3转化为二进制:11
5转化为二进制:101
注意,存入大小为4个字节的a里面,a是32个比特位,11和101存入电脑变成了
3-> 00000000 00000000 00000000 00000011 原码
5-> 00000000 00000000 00000000 00000101 原码
也就是补零,补够32位
电脑存储3和5,存储的就是这两串二进制序列
那搞明白了3和5存储方式,那3+5在电脑中是怎么实现的呢?
可不是简简单单的3+5;
存什么,自然用什么加
3+5
00000000 00000000 00000000 00000011
+
00000000 00000000 00000000 00000101
=对应的位相加(满2进1)
00000000 00000000 00000000 00001000
00000000 00000000 00000000 00001000
方便点看=1000 ->8
3+3呢?
为了方便看,省略些零
00000011
+
00000011
=
00000110

那么负数呢?负数是怎呢存储的呢?
3
00000000 00000000 00000000 00000011
显然-3,需要一个东西表示符号即可
于是规定:进制的首进制位为符号位【1表示负,0表示正】
-3
10000000 00000000 00000000 00000011 原码
但电脑真就把这一串二进制的原码存进电脑里吗?
对于负数,电脑存的并不是其二进制的原码,而是二进制原码进行相关转化后得到的补码
怎么得到补码呢?
原码(除符号位,其余取反)-> 原码(加1)-> 补码
具体如下
-3原码 10000000 00000000 00000000 00000011
-3反码 111111111 111111111 111111111 111111100
-3补码 111111111 111111111 111111111 111111101
电脑存入负数的补码
电脑通过对其不同数字的补码进行运算,从而得出结果;【正数的原反补相同】
5-3=2
5的补码 00000000 00000000 00000000 00000101
+
-3的补码 111111111 111111111 111111111 111111101
=
2的补码:00000000 00000000 00000000 00000010
【本来是100000000 00000000 00000000 00000010】【前面突出的1截断掉】
又因为正数原=反=补
所以
2的原码00000000 00000000 00000000 00000010
翻译就是2
注意,计算机只能做加法
5-3是通过5+(-3)实现的
同理-3
原1000 0000 0000 0011【方便观看简单写】
反1111 1111 1111 1100
补1111 1111 1111 1101
…………………………………………………………………………………………………………
补1111 1111 1111 1101【原先是反码+1得补码,按理-1得反码,但是计算机只有加法】
反=
补1111 1111 1111 1101【-3的补码】
+
1111 1111 1111 1111 【-1的补码】不是简单的+(-1);对像是补码,自己也要化为补码
= 1111 1111 1111 1100 【例如111+111=11110】
取反
1000 0000 0000 0011【变回来了】
以上就是原码,反码,补码,加法减法在计算机内存中的运算方法
如有错误请纠正与讨论