那说到这有的同学可能就要问了:“既然有这么多不同的整数类型, 那么当我在程序中要定义一个整数类型的时候, 我应该如何选择呢?我应该选择把它定义成 哪种整型的子类型呢?”那么要搞清楚这个问题啊,我们就要搞清楚 那么不同的这些整数类型它们在内存空间里头进行存储的时候 到底有什么区别。也就是说,我们先要讨论一下整型数据的存储的问题。 我们先来看一张图。比方说啊,我们在一个程序里头定义了这样的一个变量。 unsigned int i=123,也就是123。 那么我们都知道,这样的一个变量定义呢, 定义了一个整型的数据。并且呢这个数据还是 unsigned的。啊,是无符号类型的。我们可以知道一个整型的数据它要占用 32位的内存单元。也就是4个字节。 那么在这儿呢,我们把这4个字节啊,拉平了画在这里。 啊,那么我们知道在内存里头它们应该是纵向排列的。 那么在这呢为了表示的方便,我们把它拉平了。 拉平了以后呢,我们把这个123转换成相应的二进制数放进来。 也就是说,一个unsigned int型的数,如果它是123的话,那么在内存里的存储状况就应该是 这个样子的。那么对于无符号的数是这样来存储的。那么对于有符号的数呢?我们再来看一个例子。 那在这个例子里头呢,我定义了这样一个变量。 signed int i = -123。通过刚才的介绍我们知道, 这个signed也可以不写,直接写 int i = 123呢也是一样的。 我们就定义了一个有符号的整型数。那么有符号的整型数在内存里面是怎么存储的呢? 它仍然占了32位,也就是4个字节。 那么跟无符号的整型数据最大的区别就在于, 它专门拿出来了这个数的第一位,这个标红的这一位。 用来干嘛呢?它不用来表示具体的数据,它只用来表示 数据是正的还是负的。也就是说它被用来当做一个符号位。 符号位。它只用来表示这个数据是正数还是负数。 1表示这个数是个负数,那么0呢表示这个数是个 正数。用剩下的其他的部分用来表示这个具体的数据。 也就说在这啊,这个负的123, 被拆分成了两部分来保存。这个负号用符号位来表示。 这个1,2,3用后面的这些数据位来表示。 啊,这就是有符号数的表示方法。 那么看到这儿,我们就应该有这样的一个感受了。你看对于无符号的整型, 我用它全部的32位都来表示数据了。对于有符号的整型, 我用了后面的31位来表示。所以有一个直观的想象就是这两个数 所能表示的最大的那个数哪个更大一些啊?是不是无符号的这个 整型的数所能表示的最大的那个数会更大一些啊?因为它有32位来 表示啊。有这样一个直观的一个印象。在说到这的时候呢,有的同学可能已经发现了: “诶,老师,我发现一个状况不太对啊。你这是正的 123,它所对应的二进制的数写的是这个。 0,0,0,0,0,0,0,一串的0,然后1111011。 然后这呢,是负的123。负号呢是由这个1来表示的,剩下的应该对应的123 才对啊。那为什么在这写的这个二进制的数 和底下这个二进制的数不同呢?这是为什么呢?” 那下面我们就来回答一下这个问题。这个问题呀,也很好解释。那是因为 正整数的二进制表示方法和负整数的二进制表示方法是不同的。 看这个图。其实在计算机中啊,我们去存储一个整数的时候啊,我们并不是全部 都直接把这个整数转换成二进制数存储起来的。而是呢,我们存储了它的 补码。对一个正整数而言,比如123。那么我们存储的 是它的原码。啊,因为它的补码就等于它的原码。 那对于一个负整数而言,我们其实是存储了它的补码。 那么为什么负的123的补码就长成这个样子了呢? 其实呀,对于正数123的原码和 负数123的补码之间存在着这样一种关系, 也就是对正数123的原码进行取反并且加1这样一个操作, 我就可以得到负的123的补码。那么反之亦然, 对于负的123的补码我也可以再进行一个取反加1的操作,从而得到 正数123的原码。那就是这样一种关系。 我们举个例子。那ok我们通过例,我们通过一个例子 来看一下这个过程。比方说我们现在要求取负的123 在计算机中的表示。那么要求取一个负数123 的补码,我们应该分成这么几步来做。首先第一步, 先确定它的符号位。因为它是一个负数,所以说无论如何, 在计算机中对这个数字进行表示的时候啊,它的符号位都是1。这个可以先确定下来。 那么第二步呢,我们就要求出负的123的绝对值。也就是 整数123的原码。 求取一个整数的二进制表示的方法呢我们已经讲过了。 那么123的二进制表示呢就可以转换成1111011。 可以就把它写在这里。高位呢通通都补0。因为用不着的话,那么我们通通都补0。 于是呢,我们就可以得到了正数123的原码。那么基于这样一个原码我们就去 可以求取负数123的补码了。怎么求呢? 接下来我对这个原码的每一位各位都取反。 也就是原来是0的现在变成1,原来是1的现在变成0。当然符号位例外。那么 我们就又得到这样一个结果。原来全部是0的现在全部变成1,原来是1的全部变成0。 得到这样一个结果。但还没完,在这个基础上呢,我们再进行一个加1的操作。好, 在这个数的基础上呢再加上1,我们就可以得到了这样一个数。那么这个数呢,就是负的 123的补码。Ok, 最后呢,所以呢,我们把这个数存储到负的123的相对应的存储空间里头。 所以呢,我们把这样的一串0和,1和0的组合 存储到负的123所对应的存储空间里头。在这儿啊,我想说明两点。 第一点,关于如何求取一个负数的补码的问题,在我们这个课上, 不属于要求你掌握的内容。只要大致了解就可以了。第二点, 有的同学可能会问:“既然呢,我可以用这个符号位来表示这个数的正或者负,那为什么 我不利用后面的这些位来存储这个数的原码,而要 费劲地去求它的补码呢?”那么关于为什么这么做的原因, 等到你学到《计算机原理与组成》这门课的时候你就彻底明白了。那在这儿呢我只想告诉你, 整数的这种表示方法非常有利于在计算机中进行运算。它的 运算效率会高很多。你只要大致了解这一点就可以了。 Ok,这是关于整数是在计算机中如何表示的。