我们先来说一下整型数据。
所谓整型数据啊,其实就是整数型数据。对应到整型变量的话,
就是用来存放整数的变量。
那么在C或者C++程序里头呢,整型数据啊又被分
成了好多种,比方说基本型,
短整型,长整型。那么对应到关键字呢,基本型
又叫int型,短整型呢又叫short型, 或者是short
int型。啊,这两个书写方式呢虽然不一样,但它的含义是完全一样的。
啊,也就是说,你可以不写这个int,光写short,也是可以的。再就是long型,
啊,或者是long int型,这两个的基本含义也是一样的。
有的同学可能已经犯怵了,怎么这么多类型啊!别着急,其实最常用的就是int型。
啊,但是其他的类型呢,你应该了解。所以说我们在这给大家介绍一下。
那为什么要区分这么多的类型呢?这些类型是按照什么区分的呢?
首先这3种类型啊,是按照当你定义一个变量的时候,
这个变量在内存空间中所占的
存储单元的多少来区分的。
什么意思呢?看这个图。这个图啊,给出来了这3种基本类型
所占的内存空间的大小。
比方说,当我们定义一个int型的数据的时候,
那么计算机呢就要在内存空间里头开辟一个32位长度的内存空间。
32位是多少啊?是4个字节。 4个Byte。什么意思呢?也就是说,
当你要在程序中存储下一个int型的数据的话,
那么它就要占用4个字节的内存空间。
那如果让你来想象一下,你应该按照这张图来想象。
也就是说,当你在程序中定义了一个int型的变量的时候,
这个int型的变量要在内存里边占用4个字节。
1,2,3,4,4个字节。
啊,要这样来想象。在这呢,为了表示的方便,我们把
这个4个字节啊,横着画出来了,画成32位。
横着画出来了。那么当你定义一个短整型,也就是short型的变量的时候,
要占用多少字节呢?要占用16位,也就是2个字节。
那么当你定义一个long型的话,要占用32位,也就是4,8,32
也要占用4个字节。就是占用字节数的不同。
那我说到这啊,可能很多同学就明白了。
也就是说啊,当你想定义一个整型的变量的时候,
你其实有好几种选择。你可以把这个变量定义成
int型,也可以把它定义成short型,
也可以把它定义成long型。它们之间的不同,
只是说所占用的字节数是不同的。当然
正因为他们所占用的字节数不同,它们的表示范围也会不同。
这个事儿呢,是比较显而易见的。因为一个32位的
二进制数所能表达的数据的范围
和一个16位的二进制数所表达的数据的范围肯定是不同的。也就是说,
你要根据自己的需要去定义整数。比方说你要定义的整数是一个非常小的数,
这个数最大都不会超过一百,或者几百,几千,
那你完全可以把它定义成short型。定义成short型有什么好处呢?省空间。
虽然省空间这样的事情在我们这个课上我们并不关心,啊,但是在有些场景之下它是关心的。
那说到这呢,有的同学可能就问了:“哎,老师,不对呀。你说它们的不同在于长度的不同。
你看,长整型和基本型它们的长度不是一样的吗?”
在这啊,我要特别特别地说明一件事情。
这件事情跟C或者C++语言的标准 是非常相关的。
在C或者C++的标准里头,关于某种特定的
数据类型到底应该占用多大的内存空间,
定义得非常的宽泛。比方说,关于
int型,short型,或者long型,以上数据所占的字节数,
C语言的标准啊,只要求long型数据长度不短于int型,
short型数据不长于int型就可以了。
啊,你看这个定义啊,是非常非常的宽泛。
这个宽泛的定义带来一个什么问题呢?带来
不同的编译器里头关于int型
到底有多长有可能是不同的。
啊,这个事儿呢我们之前跟大家说过。比方说在Turbo C里头int型的长度是
16个bit,16位。那么我们在这个课上给大家介绍的所有数据类型的长度是
以Visual C++编译环境之下作为标准。也就是说在Visual C++的环境之下,
int型的长度才是32位,也就是4个字节。short型的长度呢,是16位,啊,2个字节。
其实在VC的环境里头,你看long型和int型
它们所占的字节数是一样的,都是32位。
所以在我们这个课上,大家根本就用不着long int型。因为int型和long
int型它的所占的字节长度 是一样的。如果你需要的话,你只去定义int型就可以了。那么在
其他的编译环境里头有可能long int型和int型是不一样的。
那有的同学可能就问了:“那当我去使用某种特定的编译环境的时候,
我怎么知道每种数据类型所占的字节长度到底是多少啊?”没关系,你别着急。
在这呢,我给你介绍一种办法。看这个程序。
其实啊,在C或者C++的语言里头啊,有一个专门用来测定数据类型字节长度的
运算符号,叫做sizeof。使用这个sizeof这个运算符号
你就可以打印出来某种特定数据类型的
字节的长度。比方说在这个程序里头,我们就打印了cout
sizeof(short int),sizeof(int)和 sizeof(long int)。
我们就可以打印。那么你呢,把这段程序copy到你的编译环境里头,你就可以看到
在你的编译环境里头short型,int型和long型分别占
多少字节。那当然,在我的编译环境里头,这个打印出来
那么short型应该是2个字节,int型应该是4个字节,
那么long int型也应该也是4个字部。特别需要说明的是,
sizeof这个运算符啊,不单单可以用于整型,你可以用它来
打印任何一种数据类型的字节长度。所以说大家再碰到任何
其他的数据类型我不知道它的字节长度的话,那最好的办法就是用这个程序给它
跑一下,那么去看一下某种特定类型的数据到底占多长。
Ok,这是关于数据类型的字节长度。那回到我们关于整型数据的讨论。刚才我们讲过,
根据在内存中所占存储空间数目的不同,
整型数据可以划分成int型,short型和long型。
那么其实呢那再换一个角度,
我们还可以对这3种子类型再进行划分。比方说我们可以根据
一个整型数据到底是有符号数还是无符号数这个 特性把刚才3种基本的子类型啊,
再分成不同的两类。比方说根据
有无符号这个特性可以把整型再划分成signed int型和
unsigned int型。所谓signed int型指的就是带符号的
int型。所谓unsigned int型就是无符号的int型。
那么很显然,无符号的int型它就不能用来表示负数。也就是说
当你定义了一个unsigned int型的变量的时候,你就不能用这个变量来存放负数了。
那类似的,我也可以把short型划分成signed
short型和 unsigned short型。long型划分成signed
long型和unsigned long型。 那有的同学可能就要问了:“哎老师,那我写程序的时候,我去定义的
我都直接写的int型,我没去写什么unsigned, signed的。” Ok,其实是这样的。
在程序里头啊,这个“signed”,这个关键字可以
不写。也就是说,当你不写任何的signed或者unsigned这个标识的时候啊,
那么程序默认全部都是signed,有符号的类型。只有当你刻意地去定义
unsigned的int型的时候,那程序才知道,哦,你要定义的是无符号的整型。也就是说,
当你在程序里面写出int的时候,其实就相当于写了signed
int。 当你写short的时候就相当于写了signed
short。而且加上刚才的那个省略关系,
其实在程序里头写出来short,short int,signed short, signed short int
这4种表述方法完全都是一样的。那么相应的long的这4种表述方式也是一样的。
那么说到这儿呢,我们就把那么关于整数数据类型的所有的子类型都跟大家
提到过了。虽然讲了这么多,大家千万不用紧张。为什么呢?因为在我们这个课上,除非在特殊情况下,
你都使用int型就可以了。