数据类型范围的定义

时间:2009-06-03 11:29:39

标签: c

数据类型的“范围”是什么意思,例如整数?

10 个答案:

答案 0 :(得分:7)

data type是一个抽象,应用于一块内存,将该段内存视为可以表示值的区域。

例如,单个字节由8位内存组成。在下图中,每个位由下划线(_)表示:

byte: _ _ _ _ _ _ _ _  <- 8 bits

由于我们有8个位置,我们可以输入01(因为每个存储位只能设置为onoff状态 - 因此binary),因此我们可以使用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"

对于此数据类型,范围从0255。此类型通常称为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"

上述表示称为“二补”系统,上表已根据Wikipedia article on two's complement改编。

使用这种类型的表示,在相同的8位中,我们可以定义一种表示从-128127的数字范围的方法。此表示通常称为signed byte,因为它是byte类型,可以同时具有该数字的正面和负面表示。

在比较unsigned bytesigned byte时,它们的范围不同:

unsigned byte :       0  -  255
signed byte   :    -128  -  127

但是,它们都有256种可能的值组合。它们只能通过它们可以表示的值的范围而不同。这是数据类型的范围。

同样,这也可以扩展到intlongfloatdouble类型。分配给每种数据类型的位数不同。例如:

int:  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _   <- 16 bits
long: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _  <- 32 bits

注意:每种类型的实际位数(例如intlong)可能与实现和体系结构有关,因此上图不一定正确。

在上图中,int类型由16位表示,它可以表示2^1665536个值组合。同样,与byte一样,值的范围可以是所有正数或分为正数和负数:

unsigned int  :       0  -  65535
signed int    :  -32768  -  32767

(同样,int不一定必须是16位。)

floatdouble

Floating point类型也由内存中的位表示,但它们的数据表示形式不同于整数数据类型,例如byte和{{ 1}}因为它们将一个值存储在内存中作为二进制分数和指数。浮点类型也有范围的概念。

有关如何在现代系统中定义和计算浮点值的详细信息,请参阅Wikipedia has an article on the IEEE-754

数据类型的数据范围来自值的组合,这些值可以从为单个数据类型的单个单元分配的内存量表示,以及如何将这些可能的组合分配给它们所代表的实际值。 / p>

答案 1 :(得分:6)

范围表示可以存储在给定类型的变量中的最大值和最小值。例如,如果你有unsigned char,如果我们假设数据类型的大小是8位,那么你可以存储0到2 ^ 8-1之间的值,即0-255。

答案 2 :(得分:2)

您应该在标准包含路径中查看limits.h。您的机器类型有确切的范围

答案 3 :(得分:2)

  

变量的范围

     

变量的范围是该变量可以容纳的最高值和最低值之间的差值。例如,带符号的16位整数变量的范围是-32,768到+32,767。在整数的情况下,变量定义仅限于整数,范围将覆盖其范围内的每个数字(包括最大值和最小值)。但是,对于其他数字类型,例如浮点数,范围仅表示可以存储的最大和最小数字 - 在该范围内将有许多无法表示的数字。

From wikipedia

答案 4 :(得分:2)

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)

答案 5 :(得分:1)

有关c中数据类型及其范围的更多信息:{{3p>

答案 6 :(得分:0)

范围是该数据类型支持的最小值到最大值。

C中的

整数属于16-bit

Signed int -32768改为32767,即(-2^15)改为(2^15 -1)

无符号整数: 0 to 65535,即0 to (2^16)

答案 7 :(得分:0)

Range是数据类型可以使用的值的范围,在其最小值和最大值之间定义。

答案 8 :(得分:0)

public class JavaApplication4 {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
   
   
   
    System.out.println("Byte->"+Byte.MAX_VALUE+" "+Byte.MIN_VALUE);
     System.out.println("Short->"+Short.MAX_VALUE+" "+Short.MIN_VALUE);
    System.out.println("Integer->"+Integer.MAX_VALUE+" "+Integer.MIN_VALUE);
     System.out.println("long->"+Long.MAX_VALUE+" "+Long.MIN_VALUE);
    System.out.println("float->"+Float.MAX_VALUE+" "+Float.MIN_VALUE);
    System.out.println("Double->"+Double.MAX_VALUE+" "+Double.MIN_VALUE);
    
}

}

答案 9 :(得分:-1)

在x86上,char为1个字节,short为2,int为4,float为4,double为8

根据您使用它们的方式(有符号或无符号),您可以根据该值计算范围。