数据类型范围的定义
什么是数据类型的“范围”,如整数?
数据类型是一种抽象,应用于一块内存,将该内存块视为可以表示值的区域。
例如,单个字节由8位存储器组成。 在下图中,每个位由下划线( _
)表示:
byte: _ _ _ _ _ _ _ _ <- 8 bits
由于我们有8个位置,我们可以输入0
或1
(因为每个存储位只能设置为on
或off
状态 - 因此是二进制 ),所以我们可以有2^8
或256个不同值的组合我们可以代表8位。
这是范围的概念发挥作用 - 我们如何将这256个值组合分配到可用范围?
一种方法是将256个组合中的第一个作为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
。 这种类型通常称为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
的数字范围的方法。 这种表示通常称为有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
也由内存中的位表示,但它们的数据表示forms与整数数据类型(如byte
和int
不同之处在于它们将存储器中的值作为二进制分数和指数。 浮点类型也具有范围的概念。
有关如何在现代系统中定义和计算浮点值的详细信息,请参阅维基百科有一篇关于IEEE-754的文章 。
数据类型的数据范围来自值的组合,这些值的组合可以从为单个数据类型的单个单元分配的存储器的量来表示,以及这些可能的组合如何被分配给它们所代表的实际值。
范围表示可以存储在给定类型的变量中的最大值和最小值。 例如,如果你有unsigned char并且如果我们假设数据类型的大小是8位,那么你可以存储0到2 ^ 8-1之间的值,即0-255。
你应该看看你的标准包含路径中的limits.h。 您的机器类型有确切的范围
变量的范围
变量的范围是该变量可以容纳的最高值和最低值之间的差值。 例如,带符号的16位整数变量的范围是-32,768到+32,767。 在整数的情况下,变量定义仅限于整数,范围将覆盖其范围内的每个数字(包括最大值和最小值)。 但是,对于其他数字类型,例如浮点数,范围仅表示可以存储的最大和最小数字 – 在该范围内将存在许多无法表示的数字。
来自维基百科
C中的大多数类型都取决于机器,因此您应该查看编译器为您的体系结构提供的limits.h。
对于序数类型,还有一种手动方式来检查它:
- 如果无符号:
min = 0, max = 2**(sizeof(type)*8)-1
- 如果签名:min =
-2**(sizeof(type)*8-1), max = 2**(sizeof(type)*8-1)-1
对于浮点值,您可以查看IEEE 754标准,因为它是几乎所有体系结构中使用的最常见格式。
编辑:
范围的定义是类型可以容纳的最大值和最小值之间的差异。 对于序数类型,它是2**(sizeof(type)*8)
。
更多关于c及其范围中的数据类型: 这里
范围是数据类型可以使用的值的范围,在其最小值和最大值之间定义。
范围是该数据类型支持的最小值到最大值。
C中的整数是16-bit
。
符号int将是-32768
到32767
即(-2^15)
到(2^15 -1)
无符号整数: 0 to 65535
即0 to (2^16)
在x86上,char是1个字节,short是2,int是4,float是4,double是8
根据您使用它们的方式(有符号或无符号),您可以根据该值计算范围。