当前位置:C++技术网 > 精选软件 > C++语言零基础入门教程:4.3 整数三个特性在编程中的体现

C++语言零基础入门教程:4.3 整数三个特性在编程中的体现

更新时间:2015-11-23 23:11:53浏览次数:1+次

    在《C++语言零基础入门教程:4.2 整型数据类型:数学整数定义到计算机整数定义之旅》中,我们了解了整型类型从数学演变到计算机的整型数据类型的过程,并简单介绍了计算机中C/C++语言的整型类型。但是没有介绍到正负整数如何表示,没有在将计算机整数类型解释出来,只是一个抽象的理论解释。
    那么本节课就完成计算机整型类型的三个特点的解释,请对比上一节课数学的整数的三个特性。
    首先,我们来解释整数的离散性,这个和数学的一致,不过我们来用代码演示说明。我们先来看编程中如何使用整型的。代码如下:
int a = 10;
int b = 14;
int c = a + b;
int d = b / a;

    以上代码中,使用int关键字定义的变量a,b,c,d都是表示的整型。因为这里主要是解释整数,为了不分心到语法,你只需要将a,b,c,d当做给他的数字即可。语法将在后面章节解释。
    开始就给a,b分别设置了一个开始的值,分别为10和14。此时你就知道a等同于10,b等同于14,那么c的值就是a和b相加。自然整数的相加,和数学的一样,你就知道c的值为24了。这个没有任何问题。而d呢,d=14÷10=?这是一个值得讨论的问题。
    14除以10,余数为4,用分数表示就是一又十分之四。而结果的d是一个整数。那么什么是整数?整数就是以一个个体为整体的,所以,d是无法容忍只得到十分中的其中四分,因为这个是不完整的。要么就全十分,要么就一分也不要。用小数来看,14÷10=1.4。一个小数给一个整数,d如何接受呢?自然数无法接受的。因为这是整数的定义所限定的,要么就是一整个,要么就一点也不要,不存在半个,半个的半个的说法。所以最后的决定就是d=1。多余的不足一个的一丢丢就不要了。
    这是整数的离散性问题。整数的离散就是只要整个的,不要零散的。而整个之间,可以有买一个大的送一个小的,但又凑不足一个整个。这样的就介于一个和两个之间。整数的离散就要斩掉不足一个的,从而保持高贵的个性,真的是很有个性哦。编程中这么实现也是要遵从整数的定义的,毕竟计算机是用来解决实际问题的,不能乱来。
    其次,整数的方向性在计算机中也得以体现。在上节课没有提到正负整数如何表示。在C/C++中,前面介绍的整数类型,都是有符号的,就是有正负之分的,或者说,是可以接纳正数也可接纳负数的。看下面代码:
int a = 10;
int b = -5;
int c = a+b;

    a,b,c都是int类型的整数,而b却给了-5,这样b的值就是负数了。这是整数的方向性在计算机中编程中的体现。
    最后,那就整数在计算机中独特的有限性。这个和计算机特性有关。一个计算机的内存再大,都是有限的。计算机中内存的位数长度决定了所能表示的数值的范围。整数所能表示的范围又和正负有关。同样一条长度的,如果都表示正数,可以表示到256个正数,但是如果要将这256个数的长度同时既有正数也有负数,就对半拆好了。中间留一个0.那么正数就只有一半,负数也只有一半。然而要多加一个零,那么正负数要有一个牺牲一个数,让给0。
    那么问题来了,如何确定一个整数总数有多大?又怎么知道正数负数分别是什么范围呢?
    我们对整数的理解,最关键的就是这两个问题了。搞清楚了,就简单了。我们先来看只有正数的。假设整数用8位二进制表示,从00000000到11111111,如果将11111111再加1,就有九位了即100000000.如果这个是十进制的,我们就会将结果算为:10的8次方。那么这里是二进制的,所以对应的就是:2的8次方,然后减去多余的1,结果就出来了,二进制的11111111就是十进制的256了,减掉一个就是255.从1到255就是255个数,再加上00000000这个0,一共就是256个数。所以,我们可以知道,实际上,计算机中一个整数能表示多大的数整数就只用看整数所用的位数即可。

    以上是所有的二进制的位数都是用来表示正数的情况,包括0.其实8位的正数就只有255个。在255个数中如何平分成两组呢?没办法,平分不了。一个127个,一个128个。到底如何分,就看负数如何表示咯。这样分出来哪样就哪样咯。

   

    如果一个整数要正负数都可以表示,那么他的骨子里就要为负数留一个标志位,如果这个标识为正的,那么他就是正数,如果标识是负的,那么他表示的就是负数。那么你觉得放在哪合适呢?是最后一个?当然不是咯,这个位置很快被用来放数字了,起不到标志的作用。那么自然就是最顶的一个,标志是至高无上的,才不至于码砖的时候把标志给砸坏了。连续的八个二进制,我们习惯把最左边看做最高位,最右边看做最低位,因为二进制只有0和1两个数字,所以自然就想到了用0和1来做正负的区别了。规定就是:如果一个整数是正数,也就是无符号的整数,那么所有的数字位都是存放数字用的,没有标志位,因为他只可能是正数和0。如果一个整数是有符号的,如int等,那么就需要在最高位用0表示正数,用1表示负数,0就是正数的一种咯,这种表示划归到正数类型中了。所以呢,有符号整数中,最高位以1开头的就全部是负数,最高位以0开头的就是正数和0的非负数。最高位0和1对半分了,所以,负数有128个,正数有127个,0有一个。所以负数是占多数的哦。再嘱咐一句,这里说的,是指整数二进制位数用8位表示的。那么负数的个数就可以用2的(整数位数个数减一)的次方。这个是最好计算的。正数和0就可以对半开就好了。8位有符号整数负数的范围就是-1到-128,那么正数呢自然是从1到127咯。
    至于在这个数据范围内的计算,则会涉及到数据范围的循环转化,正数最大之后再加就到了负数,负数最小后再小就回到了正数这一边。这里就不展开了。反正,编程中,你需要在你的范围内计算,你要有一个范围概念即可。超出范围带来的错误,你知道是这个问题就可以了。
    如果在整数关键字前加上unsigned表示为无符号的。sign就是符号的意思,unsign就是去掉符号,就是非负数,所以unsigned int 就是无符号的int类型了。其他的比如unsigned long等,以此类推。实际编程中,我们使用的位数都不一定是8位,通过sizeof(int)这样的可以查看整数占用的字节数,一个字节8位,从而就可以计算这个整数的位数,也就可以计算出整数所能表示的范围咯。编程中一般我们不会太纠结这个范围问题,不过我们需要清楚的了解范围和正负是怎么回事。