整数的最大值是多少?

338
在C语言中,整数(对于32位机器)是32位,范围从-32768到+32767。在Java中,整数(长整型)也是32位,但范围从-2147483648到+2147483647。我不明白为什么在Java中范围不同,即使位数相同。有人能解释一下吗?

45
在Java中获取整数的最大值和最小值,使用Integer.MAX_VALUE和Integer.MIN_VALUE。 - live-love
7
一些对你的问题非常好的答案 - 你应该接受其中一个 :) - Darragh Enright
2
@DarraghEnright 他最后一次出现是在2015年3月,我怀疑他不会回来了 :( - Ungeheuer
4
@Adrian 哈哈 - 我猜不会!我想这种情况可能有点发生。我一直认为,只要问题超过一定年龄、提问者消失了,而且有一个得票很高的明显有用的答案,SO 就可以轻松自动接受答案。 - Darragh Enright
2
@DarraghEnright 同意。但是 OP 两周前在这里,他有机会接受,所以从技术上讲他并不缺席。 - gaborsch
显示剩余3条评论
11个回答

443
In C, 语言本身并不决定某些数据类型的表示方式。它可以因机器而异,在嵌入式系统中,int 可能是16位宽,但通常为32位。
唯一的要求是 short int <= int <= long int 的大小。此外,有一个建议是 int 应该表示处理器的本地容量。
所有类型都是有符号的。unsigned 修饰符允许您将最高位用作值的一部分(否则保留为符号位)。
以下是可能数据类型的可能值的简短表格:
          width                     minimum                         maximum
signed    8 bit                        -128                            +127
signed   16 bit                     -32 768                         +32 767
signed   32 bit              -2 147 483 648                  +2 147 483 647
signed   64 bit  -9 223 372 036 854 775 808      +9 223 372 036 854 775 807
unsigned  8 bit                           0                            +255
unsigned 16 bit                           0                         +65 535
unsigned 32 bit                           0                  +4 294 967 295
unsigned 64 bit                           0     +18 446 744 073 709 551 615

在Java中,数据类型的表示由Java语言规范确定。
顺序为:byte 8位、short 16位、int 32位、long 64位。所有这些类型都是有符号的,没有无符号版本。但是,位操作将数字处理为无符号(即正确处理所有位)。
字符数据类型char宽度为16位,无符号,并使用UTF-16编码保存字符(但是,可以将任意无效字符代码点的无符号16位整数分配给char)。
          width                     minimum                         maximum

SIGNED
byte:     8 bit                        -128                            +127
short:   16 bit                     -32 768                         +32 767
int:     32 bit              -2 147 483 648                  +2 147 483 647
long:    64 bit  -9 223 372 036 854 775 808      +9 223 372 036 854 775 807

UNSIGNED
char     16 bit                           0                         +65 535

11
C标准还规定了INT_MAX、LONG_MAX等的最小值。 - Oliver Charlesworth
17
Java 8现在也具有无符号整数:http://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html - Jakub Kotowski
4
谢谢,@jkbkot,知道这个对我很有帮助。虽然看起来表示仍然是带符号的,但某些无符号操作被实现为函数。将两个无符号的整数相加是困难的... - gaborsch
6
在Java中, int foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo)); 输出 2147483648,并且 char 是一种无符号类型 - howlger
2
@howlger Integer.MAX_VALUE + 1 在十六进制中是 0x80000000,因为发生了溢出(等于 Integer.MIN_VALUE)。如果将其转换为无符号(long),则符号位将被视为值位,因此它将是 2147483648。 感谢您提供关于 char 的说明。char 是无符号的,您是正确的,但是 char 实际上并不用于计算,这就是为什么我从列表中删除它的原因。 - gaborsch
显示剩余3条评论

83
在C语言中,整数(对于32位机器)为32位,范围为-32768到+32767。
错误。以2的补码表示的32位有符号整数的范围是-2^31至2^31-1,等同于-2,147,483,648到2,147,483,647。

24
一个32位整数的范围是从-2,147,483,648到2,147,483,647。但是,您使用32位机器并不意味着您的C编译器使用32位整数。

1
至少我的 Kernighan 先生和 Ritchie 先生的《C 程序设计语言》副本在 A4.2 中说 int 是“机器的自然宽度”,我会将其解释为在编译 32 位机器时为 32 位。 - junix
7
我相信这取决于编译器,而不是机器。例如,我曾在我的64位机器上安装了一个16位编译器。 - Ivaylo Strandjev
2
@junix 我相信这正是我在我的回答中指出的。操作系统并不指定您的整数有多少位。目标平台是编译器的属性,而不是它正在工作的操作系统或处理器的属性。 - Ivaylo Strandjev
正如我在第一条评论中写的那样,“在为32位机器编译时它是32位”。OP在他的文章中写道“整数(适用于32位机器)”。所以我理解他提到的不是他的操作系统或机器,而是他的目标平台。 - junix
不,我认为OP在某处读到了关于int最小范围,确实是-32768+32767,但没有注意到这只是一个最小值,实际范围取决于机器。而且,我在你的解释中缺少的正是与机器依赖性的链接。这就是我的第一条评论。 - junix
显示剩余4条评论

16
C语言定义了各种数据类型的最小范围。对于int,该最小范围为-32767到32767,这意味着int至少需要16位宽度。实现可以提供更宽的int类型,范围相应地更广。例如,在我工作的SLES 10开发服务器上,范围为-2147483647至2137483647。
仍有一些系统使用16位int类型(全世界不是VAXx86),但有很多系统使用32位int类型,也许有一些系统使用64位。
C语言旨在运行在不同的架构上。Java被设计为在隐藏这些架构差异的虚拟机中运行。

1
对于16位整数,其范围为-32768到32767。对于32位整数,其范围为-2147483648到2147483647。范围从-2^(n位-1)到+2^(n位-1)-1。 - mythicalcoder
4
@Maven:5.2.4.2.1 - INT_MIN被指定为“-32767”。不要假设是二进制补码。 - John Bode

10
Java中int的严格等价于C语言中的long int。 编辑: 如果定义了int32_t,则在精度方面它是等价的。 long int保证了Java int的精度,因为它保证至少为32位。

你是对的,如果由你的编译器定义,那么等价的类型是 int32_t - UmNyobe

8

7

这是因为在C语言中,32位机器上的整数并不意味着使用32位存储它,也可能是16位。这取决于机器(实现相关)。


1
嗯,值得注意的是,典型的实现行为是使用“机器宽度”作为int的位数。但是,limits.h可以帮助我们找出确切的真相。 - junix
3
实际上,我认为没有一款32位C编译器使用非32位int进行制作。尽管标准允许对int的编译器实现采用愚蠢的方式,但出于某种原因,没有人想要制作一个愚蠢的C编译器。流行趋势是制作有用的C编译器。 - Lundin

5

实际上,intshortlong的位数取决于编译器的实现。

例如,在我的Ubuntu 64位系统上,short32位,而在另一个32位Ubuntu版本上则为16位。


5
这其实很简单,你甚至可以用谷歌计算器来计算: 一个整数有32位,计算机是二进制的,因此每个位(点)可以有2个值。 如果你计算2的32次方,你会得到4,294,967,296。所以如果你把这个数字除以2(因为其中一半是负整数,另一半是正整数),你就会得到2,147,483,648。这个数字是能够被32位表示的最大整数。但是如果你仔细观察,你会发现2,147,483,648比2,147,483,647大1,这是因为其中一个数字代表0,恰好位于中间。不幸的是,2的32次方不是一个奇数,因此中间没有只有一个数字。所以正整数少了一位,而负数却得到完整的一半,即2,147,483,648。
就是这样。这取决于机器,而不是语言。

4
这不是他所问的...问题是“为什么C语言中的int类型与Java语言中的int类型不同?” - ElectronWill
2
在Java中,int的大小不取决于计算机。 int == 32位有符号的2补码由Java语言规范定义,并镌刻在阳极氧化[超不可得]的金属板上。(好吧,也许最后一句话不是很准确。) - Stephen C

2
在C语言中,__int32的取值范围为-2147483648到2147483647。完整的范围请参见此处
unsigned short 0 to 65535
signed short –32768 to 32767
unsigned long 0 to 4294967295
signed long –2147483648 to 2147483647

并没有保证'int'是32位,如果您想使用特定大小的变量,尤其是在编写涉及位操作的代码时,应该使用“标准整数类型”。

在Java中

int数据类型是一个32位的有符号二进制补码整数。它的最小值为-2,147,483,648,最大值为2,147,483,647(含)。


2
您引用的C值仅为最小范围。 - Oliver Charlesworth
@OliCharlesworth 范围是从最小到最大。 - Achintya Jha
6
我的意思是,每种类型的范围允许比你上述引用的更大。 - Oliver Charlesworth
@OliCharlesworth 已添加完整范围的链接。 - Achintya Jha
3
在C语言中没有叫做__int32的东西。微软没有严格符合C标准的编译器,所以谁在乎他们的非C编译器如何工作?唯一相关的参考是ISO9899,要么是5.2.4.2.1 "整数类型的大小",要么是7.20.2.1 "精确宽度整数类型的限制"。这些规范都与微软的程序不兼容。 - Lundin
2
C99将int32_t、int16_t等添加到标准中。它们与Microsoft的附加内容不完全兼容,但它们以类似的方式工作。 - Ask About Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接