那么,下面呢,我们再来考虑一个问题,既然啊,我已经
知道了,整数在计算机的内存里头是如何去表示的,
而且呢,我也知道了,如何把一个我所设想好的二进制
数输入到计算机里头,让它以十进制这种的方式打印出来,那接下来,我是不是很容易就可以去做,
一件事情,什么事情呢?我想知道啊,对于不同类型的整数,比方说,unsign
int 型,或者是,signed int型,这种类型的数所能表示的,最大值和最小
值,分别是什么,比方说,对于一个无符号的整数而言,那么最大的
数一定是这个数了,啊,就是把里面全都写满
1,啊,这一定是这个数最大的数了,
那,这个数到底是多少呢?啊,这是一个问题,我想知道的,
接下来,对于一个signed int型,也就是说,对于一个有符号的,
整数,这样的一串数,也无疑是最大的一个数了
我也想知道,它是多少?那现在是不是很简单
了,我们就想办法,把这个数所对应的十六进制数输到程序里头,然后以十进制的方式打印输出,
就可以了,然后呢,我们再想办法把这个数所对应的十六进制数输入到程序里头,也以十进制的形式打印输出,我们就可以
知道,它的所表示的最大的数分别是什么了,ok,我们先来看第一程序,来算这个最大的数
啊,因为,这里头全都是1,所以说,它所对应的十六进制数一定是
全都是F,那么这个数呢,以0x开头,我就可以
把它写,输入到程序里头了,啊,赋给一个unsigned的
类型的整数a,然后,我想办法用十进制的方式把这个a再打印出来,那么这个程序的执行结果呢
啊,就是这样的,啊,我们可以看到,通过
这个我们可以知道,对于一个无符号的整数,它所能够表达的最大的数
是这个数,这个数字啊,大家没必要去 记,因为记的话,你也很难记得住,但是啊
在这儿,我觉得,我需要带你们大家,对这个数啊,有一个
感觉,什么意思呢?万一你写到程序里啊,
要保存的那个数,真的超出了这个数的话,你还真
的不能用int型来表示它,那么对于这种特别长的整数怎么去表示,以后
我们再说,所以说,大家对这个数,应该有一个初步的感觉就可以了
你只要记住,它大约等于四十二亿
就可以了,当我们在程序里头去定义变量
的时候,一定要留有充分的余地
ok,这是关于无符号的最大的数,那关于有符号最大的数呢?
一样啊,对于这样的一个数,有符号的,啊,那我们就可以写 这样一段程序,啊,依然
把它输入进去,只不过,在这定义的时候,千万要小心,我一定要定义成signed
int 型,然后呢,我再通过十进制数,把这个a打印
出来,那么这个程序的执行结果呢?
就是这样的,啊,我们就可以看到,奥,这个最大的数是,21474
83647,也请大家对这个数呢,有一个感觉,啊,大概是二十一亿的样子
刚刚呢,我们分析了,对于有符号的整数和无符号的整数所能够表示的最大的数,那我现在呢,想让
大家考虑一下,那最小的数呢?那有
的同学可能说了,啊,无符号的数当然最小的数应该是0了,
这个很容易想明白,那么对于有符号的数呢?是不是这个呀,是不是这个数啊?
你看这个数,一定很小,啊,因为呢,符号位是1,所以说它是一个负数,然后后面呢,全都是1,
啊,那应该是一个很大的数,所以说,是一个很大的负数,它应该是最小的数
对吗?当然不对,啊,如果这么想的话,那么你可能忘记了,那么对于一个负数而言
在内存中存储的是它的补码,所以并不是你看到的这样子,那对于有符号的数而言
什么数才是最小的数呢?在回答这个问题之前啊,我先
请你来看一段程序,首先呢,我定义了一个有符号的数
a,然后给它赋了一个初值,大家注意看这个初值,0x7ffff
这是什么啊?这是不是那个最大的有符号的数啊,对吧?
这是那个最大的有符号的数,这是max,啊,ok,那我现在做
什么动作呢?我给这个最大的数啊,+1 啊,本来就够大的,我再给它+1,然后呢,我用十进制的方法,把这个数
打印出来,你能想象一下结果吗?它的结果是
这样的,这个结果等于 -2147483648
啊,我想跟大家说的是,这个数就是那个有符号的数所能表示的
最小的数,哇,那有的同学可能
就要问了,啊?把一个最大的数,加了一,就变成
了一个最小的数,这不是见鬼了吗?啊,肯定没有见鬼,因为
这个世界上没有鬼,那么我来解释一下,它发生了什么
首先,我们来看一下这个最大的数,啊,0x
7ffff,那这样的一个数呢,表示出来之后,应该是这样子的,开头是0,所以后面是
一个正数,啊,也就是说,后面就是这个数的原码,那么就意味着,这个数肯定
是一个最大的数,啊,因为已经把所有的1都用上了 这是那个最大的数,那么,对这样一个数如果进行加1的操作,
会得到什么呢?如果进行加1的操作,它
一定会得到这样一个数,1000000..,啊
那这个数怎么去解释呢?啊,不难解释,
我们来看一下,它的最高位啊,是1,也就是说啊,它应该是一个
负数,然后其他位都是0,啊,那么最直观的一个解释,这个数就是,
负0,啊,当然,0是没有正负区分的,那么在
C语言中啊,做了这样一个规定,做了这样
一个规定,当最高位是1,其他位都是负0,都是0的时候,那么最高位的这个
1呢,既表示符号位,又表示 数字位,也就是说啊,对这个数而言,如果1表示符号位,它就是一个
负数,如果1表示数字位,那这个数呢经过计算,我们就可以知道,应该等于
这个数,啊,十进制数应该等于它,那当1既表示符号位,
又表示数字位的时候,那么最后这个数算出来就应该
等于-2147483648,这就是我们说的最小的那个数,那么到此
为止呢,我们就把int型数据所能够表示的最大的数和最小的数,啊,全
部都搞清楚了,那么关于其他的整数类型,所能表示的数的范围,应该是怎样的呢?我
这有一张表,啊,就把这个呢,全部都列出来了,啊,比方说对于short型,它所能表示的
范围是这样的,ok,关于,整数型,我们讲了这么多,有的同学可能觉得都有负担了,哎呀,
怎么这么复杂,没关系,那么此上的这些
知识呢,我希望大家能够了解,如果你实在不
想去搞明白,那也没关系,只要你在以后的作业里头,尽量使用int型,就
可以了,这是关于整数型数据,我们想传递给大家的一些
知识,那么最后呢,还有一点点内容,就是一个使用须知,我们来
看一个程序,这个程序呢,非常的简单,在这个程序里我定义了一个变
量a,然后紧接着呢,在下面,我把变量a,输出出来了,同学们知道这个程序的运行结果吗?
这个程序啊,很有意思,你可以呢,把类似的这样一个程序,在你的编程环境里面,啊试一下
首先,在不同的编程环境里头,很有可能你会看到
不同的结果,那么在相同的编程环境里头,你也
有可能看到不同的结果,比方说,对于这样一段程序,如果我们把它放到VC2008的环境中,
啊,它会打印出来一个非常小的负数,
那么如果把它放到VC2013的环境里头,它直接就会报错了,因为系统
可以提示你,如果把它放到eclipse里头,那么它的运行结果将是这样
的,这是在我的机器上,啊,跑的某一次的
运行结果,那为什么会这样呢?原因就在于,你根本就没有对a进行初始化
这就提示我们,一定要养成这个好的编程习惯,在任何时候
定义一个变量的时候,我们都紧接着对这个变量进行初始化
直到,你不需要再去定义变量的那一天
啊,什么意思呢?只要你不写程序了,你就可以不保持这
个习惯了,或者是说,程序设计语言进行了改进,不再要求你定义变量了
ok,你就可以不赋初值了,好,关于整数部分,我们就讨论
这么多,整数呢,是我们在编程的过程中,使用最频繁,也是我们应用程度最深的一种
数据类型,所以说呢,我们稍微多讲一点,那接下来呢,我们再去探讨其他的数据类型。