在什么基础上决定了任何数据类型的大小和范围?

时间:2011-08-12 08:08:56

标签: c# java c++ c

我知道什么是决定任何数据类型大小的基础。例如。 java中intger数据类型的大小为4个字节。那么为什么它恰好是4而不是其他任何东西。超过可以使用int类型存储的最大数量是2,147,483,648。这个号码来自哪里?我的意思是为任何其他数据类型获取此数字的公式是什么?

但为什么它恰好是4?我还是不清楚。有人说要表示特定数据类型范围内的任何数字。但是还有其他数据表也可以提供更大的范围。还是那么困惑......

8 个答案:

答案 0 :(得分:3)

因为4个字节是4 * 8 = 32位。 2 ^ 32 = 4294967296 对于unsigned int这是最大数字,对于signed int,它是2 ^ 32/2,这是你的数字。 表示数据类型的字节数由体系结构决定。对于C ++,只有sizeof(char)保证为1。

答案 1 :(得分:3)

我不知道从哪里得到你的号码,这是错的。这些类型的最大数量总是奇数而不是偶数。

对于unsigned类型,C规定它总是使用带有位的表示,比如x位。那么最大值总是2到x减1的幂,因此是奇数。

对于signed类型,规则对于最大值(因此为正值)是相似的。对于最小值,事情有点复杂,但通常这使用所谓的负数的二进制补码表示,最小值通常是(最大值的负数)减去1,所以是偶数。

答案 2 :(得分:2)

4字节= 4 * 8位= 32位。现在2 ^ 32 = 4294967296。除以2,得到2147483648.因此int从-2147483648跨越到+2147483648。

答案 3 :(得分:2)

在汇编程序中,类型的位大小由必须使用数字的体系结构定义。大多数当前架构将位分组为8位字节,并且在转到下一个类型时将其大小加倍:8,16,32,64,128 ......但并非所有架构都支持所有类型,以及一些旧架构有奇怪的类型(例如14位整数)。

当您使用编程语言时,语言会抽象较低级别,并且语言中的类型被定义为抽象较低级别的类型。根据语言的不同,类型可能会有所不同:charshort intint一些建议short, tall, grande。在某些情况下,它将被精确定义(在Java或C#中,int正好是32位,而long是64位),而在其他类似C / C ++中,只定义了类型之间的关系( long不小于intshort不小于char,然后2^N-1 ...)

给定无符号类型可以容纳的最大数量可以计算为4294967295,因此对于32位无符号整数,最大值为-12^N部分的原因是0个不同的数字,其中一个是2^N-1,因此只留下N非零值。

当谈到有符号整数类型时,架构还有很多话要说。大多数当前架构使用two's-complement。在这些平台中,2^(N-1)-1位有符号整数的最高有符号值为-2^(N-1),最负数为0。一些较旧的架构为符号保留一位,然后存储实际数字,在这种情况下,负范围将减少一(此方法允许两个零值:-0int)。 / p>

关于你的问题,你必须先选择语言。然后,在C或C ++的情况下,您将不得不选择您的平台,甚至编译器。虽然在大多数情况下类型是直接相关的(long大多数 32中是32位,在C ++中是64位架构),但这是不能保证的,并且某些类型可能不同({{1} }可能表示32或64位整数类型)。除了char之外的C ++类型的实际大小(保证有CHAR_BITS位),您可以使用sizeof(type)*CHAR_BITS来获取位大小。

答案 4 :(得分:1)

全部由硬件决定。在设计这些语言时,32位平台正处于流行之中。这意味着使用32位数操作最有效,指针是32位。最常见的平台有8位字节,因此32位是4字节。最常见的有符号整数表示为two's complement,因此最大可表示数字为2 31 -1或2,147,483,648,最小值为-2 31 或2,147,483,647。无符号整数的范围为0到2 32 -1或4,294,967,295。

C ++实际上并不要求整数具有这些大小。它适用于在更广泛的平台上编写高效代码,因此它说:

  

有四种带符号的整数类型:“signed char”,“short int”,“int”和“long int”。在此列表中,每种类型至少提供与列表中前面的存储一样多的存储空间。 Plain intss具有执行环境体系结构所建议的自然大小;提供其他有符号整数类型以满足特殊需求。

答案 5 :(得分:0)

弗拉基米尔的一个略微变体:

Int是签名数据类型,因此Vladimir说:

4 bytes = 4*8 bits = 32 bits. 

实际上,2^32 = 4,294,967,296

因为这是签名的,所以你将这个值减半,所以max = 4,294,967,296 / 2 = 2,147,483,648

答案 6 :(得分:0)

首先,计算机只能理解binary digit(0和1) 8个二进制数字(位)组将组成最不可寻址的存储单元(字节)。

由于byte只能表示256种不同的状态,因此远远低于我们的要求。其他units通过使用多个字节来表示单个值来定义,例如int来表示整数。

每个单元的解释方式可以在上面的链接中找到。

答案 7 :(得分:0)

为了提高效率,原始数据类型倾向于基于硬件架构提供的数据类型。甚至独立于平台的语言(如Java和C#)也在设计时考虑了常见的32位处理器。正如其他人所解释的那样,整数类型的最小值和最大值取决于可以用每种类型中可用的位数表示的最低和最高数字,保留一位来表示有符号类型的符号。