首先我们要知道我们所使用的电脑中的数据都是以二进制的形式存储在我们的电脑里的,所以要了解数据的储存就得了解二进制,他是计算机数据处理的基础;
ok二话不说我们直接用代码来说话,理解计算机是如何利用二进制储存数据的
int main()
{
int i = -20;
unsigned int j = 10;
printf("%d\n", i + j);
return 0;
}
这里需要求出的是i和j的和
但是有人乍一眼看会有些懵,整形和无符号数怎么相加呢?既然我们没有把握我们就需要利用二进制的概念了;
我们在计算机中存储的数据分为原码,反码,补码。那他们三个的关系又是什么样的呢?
这三种二进制表示方式都有符号和数值两部分:
符号用0和1表示,1代表负数,0代表正数;
我们先用上面的代码举例:
j是正数,正数的原码,反码,补码是相同的所以j的原码为:
00000000 00000000 00000000 00001010//同样是10的反码和补码
int i=-20,i是负数,并且值是-20,所以他的二进制序列为
10000000 00000000 00000000 00010100//这个二进制序列就表示为-20的原码
那么反码就是符号位不变,其他位取反,如下;
11111111 11111111 11111111 11101011;
补码就是反码后面加上1,如下;
11111111 11111111 11111111 11111100;
最后我们将两个数的补码相加就变为
11111111 11111111 11111111 11110110;
但是最后我们是以%d的形式打印出来,所以我们还要将最后计算的补码的结果转化为原码;
补码转化成原码的方法是“减一取反”或者“取反加一”;所以计算的补码的结果转化为原码为;
10000000 00000000 00000000 00001010;
这时候我们再读原码,你就会发现结果是-10;
由此可见计算机储存和处理数据的原理就是 通过二进制的形式来处理。
了解完上述内容我们继续深入研究;
有以下代码
int main()
{
unsigned int i;
for (i = 9; i >=0; i--)
{
printf("%u\n", i);//%u打印的是无符号类型的数
}
return 0;
}
看到这个程序是否会打印出9 8 7 6 5 4 3 2 1 0呢?
这样会进入死循环,我们使用sleep让他打印的慢一点以便我们观察;则在如上代码中加入使用sleep,
(可以自己尝试敲一下)
#include<windows.h>
int main()
{
unsigned int i;
for (i = 9; i >=0; i--)
{
printf("%u\n", i);//%u打印的是无符号类型的数
Sleep(1000);//单位是毫秒
}
return 0;
}
可以看到先是打印出了循环中的i,但是为什么后面就变成了这么大的数了呢?
讲道理,当最后输出的是0的时候,再次进入循环,i--就变成了-1;但是i是一个无符号整型,所以i的取值是>=0的,所以我们还是要看这时i的二进制的原,反,补内容;
10000000 00000000 00000000 00000001;//-1的原码
11111111 11111111 11111111 11111110;//-1的反码
11111111 11111111 11111111 11111111;//-1的补码
这时我们用计算机算一下-1的补码用十进制是多少
打开电脑上的计算机切换到程序员输入刚刚的二进制序列
你就会发现和进入死循环的值一模一样啊
原因是我们将i定义为了无符号整型,所以永远>=0;并且最后输出的时候将其用%u(打印无符号数)将其打印出来,结果就会出现很大的数,所以由此可见,计算机在储存和处理数据时是转化成二进制的形式将其处理的。
希望对你有所帮助