甲数据类型是被施加到一块内存地看到,一块内存为能够代表一个值的区域的抽象.
例如,单个字节由8位存储器组成.在下图中,每个位由下划线(_)表示:
byte: _ _ _ _ _ _ _ _  <- 8 bits
由于我们有8个位置,我们可以输入一个0或1(因为每个存储位只能设置为一个on或一个off状态 - 因此是二进制),所以我们可以有8个2^8或两个不同值的组合,我们可以从8位表示.
这是范围的概念发挥作用 - 我们如何将这256个值组合分配到可用范围?
一种方法是将256种组合中的第一种作为a 0,最终组合为255:
byte: 0 0 0 0 0 0 0 0  <- Represents a "0"
byte: 0 0 0 0 0 0 0 1  <- Represents a "1"
        .. so on ..
byte: 1 1 1 1 1 1 1 0  <- Represents a "254"
byte: 1 1 1 1 1 1 1 1  <- Represents a "255"
此数据类型,范围是从0到255.这种类型通常称为a unsigned byte,因为它可以表示的值是unsigned没有符号的.基本上,它被处理就好像它都是正数.
另一方面,由于我们有256种组合,如果我们将其中一半分配为正数而另一半是负数呢?因此,我们为字节表示分配正值或负值:
byte: 0 1 1 1 1 1 1 1  <- Represents a "127"
byte: 0 1 1 1 1 1 1 0  <- Represents a "126"
        .. so on ..
byte: 0 0 0 0 0 0 0 1  <- Represents a "0"
byte: 0 0 0 0 0 0 0 0  <- Represents a "0"
byte: 1 1 1 1 1 1 1 1  <- Represents a "-1"
        .. so on ..
byte: 1 0 0 0 0 0 0 1  <- Represents a "-127"
byte: 1 0 0 0 0 0 0 0  <- Represents a "-128"
上面的表示被称为"二进制"系统,上面的表格改编自维基百科关于二进制补码的文章.
使用这种类型的表示,在相同的8位中,我们可以定义一种表示从的数字范围的-128方法127.这种表示通常称为a signed byte,因为它是一种byte既可以具有数字的正面和负面表示的类型.
在比较unsigned byte和signed byte,其范围是不同的:
unsigned byte :       0  -  255
signed byte   :    -128  -  127
但是,它们都有256种可能的值组合.它们只能通过它们可以表示的值范围而不同.这是数据类型的范围.
类似地,这可以被扩展到int,long,float,double类型为好.分配给每种数据类型的位数不同.例如:
int:  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _   <- 16 bits
long: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _  <- 32 bits
注意:每种类型的实际位数,例如int并且long可以依赖于实现和体系结构,因此上面的图表不一定正确.
在上图中,int类型由16位表示,它是它可以表示的值2^16或其65536组合.同样,像这样byte,值的范围可以是所有正数或分为正数和负数:
unsigned int  :       0  -  65535
signed int    :  -32768  -  32767
(同样,int不一定必须是16位.)
浮点类型,如float和double也由在存储器中的位表示的,但他们的数据表示从整数数据类型的不同,如byte与int在它们将存储在存储器中作为二进制小数和指数的值.浮点类型也具有范围的概念.
有关如何在现代系统中定义和计算浮点值的详细信息,请参阅维基百科有一篇关于IEEE-754的文章.
数据类型的数据范围来自值的组合,这些值的组合可以从为单个数据类型的单个单元分配的存储器的量来表示,以及这些可能的组合如何被分配给它们所代表的实际值.
范围表示可以存储在给定类型的变量中的最大值和最小值.例如,如果您有unsigned char并且如果我们假设数据类型的大小是8位,那么您可以存储0到2 ^ 8-1之间的值,即0-255.