整数最大值


290

在C中,整数(对于32位计算机)为32位,范围为-32,768至+32,767。在Java中,整数(long)也是32位,但范围为-2,147,483,648至+2,147,483,647。

即使位数相同,我也无法理解Java中的范围如何不同。有人可以解释吗?


35
要获取Java中int的最大值和最小值,请使用Integer.MAX_VALUE和Integer.MIN_VALUE
live-love

5
@stackuser-您的问题的一些很好的答案-您应该接受一个:)
Darragh Enright

2
@DarraghEnright他最后一次出现在2015年3月,我怀疑他会回来:(
Ungeheuer

4
@Adrian haha​​-我猜不是!我想发生了一点。我一直以为SO可以在某些条件下轻松地自动接受答案-如果问题超过一定年龄,OP是AWOL,并且存在明显有用的答案,且投票数很高。
达拉格·恩赖特

2
@DarraghEnright同意。但是OP大约在2周前就在这里,他有机会接受,因此从技术上讲他并没有离开。
gaborsch '16

Answers:


392

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语言规范确定的数据类型的表示。

顺序是:byte8位,short16位,int32位,long64位。所有这些类型都是符号的,没有未签名的版本。但是,位操作将数字视为无符号的(即,正确处理所有位)。

字符数据类型char为16位宽,无符号,并使用UTF-16编码保存字符(但是,可以分配char代表无效字符代码点的任意无符号16位整数)

          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

10
C标准还规定了INT_MAX,LONG_MAX等最小值
奥利弗查尔斯沃思

13
Java 8现在也具有未签名的Integer:docs.oracle.com/javase/8/docs/api/java/lang/Integer.html
Jakub Kotowski

4
谢谢@jkbkot,很高兴知道这一点。尽管该表示形式似乎仍然是带符号的,但是某些未签名的操作是作为函数实现的。很难添加两个未签名的符号int...
gaborsch 2014年

5
@GaborSch在Java中,int foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo));prints 2147483648char是一个无符号类型
howlger

2
@howlger 由于溢出(以等于)Integer.MAX_VALUE + 10x80000000十六进制Integer.MIN_VALUE。如果将其转换为无符号(长整数),则符号位将被视为值位,因此将被视为2147483648。谢谢你的char来信。char是无符号的,您是对的,但是char并没有真正用于计算,这就是为什么我将其从列表中删除。
gaborsch

72

在C语言中,整数(对于32位计算机)为32位,范围为-32768至+32767。

错误。2的补码表示形式的32位带符号整数的范围为-2 31至2 31 -1,等于-2,147,483,648至2,147,483,647。


3
我确定了您的求幂数,**甚至不是C,而且我也不是很清楚。:)
放松

2
现在看起来更好,谢谢!我想Python太多了。我避免这样做,^因为通常是这样xor
Kos

5
我认为我的观点是,由于C没有指数运算符,所以我不认为特定的片段应该完全格式化为代码。:)
放松

19

32位整数的范围是-2,147,483,648至2,147,483,647。但是,您在32位计算机上的事实并不意味着您的C编译器使用32位整数。


1
至少我的Kernighan先生和Ritchies先生的副本“ C编程语言”在A4.2中说的int是“机器的自然宽度”,当我为32位机器编译时,我会将其解释为32位。
junix

7
这取决于编译器,而不是我相信的机器。例如,我在64位计算机上安装了16位编译器。
Ivaylo Strandjev

当然,用于16位x86代码的16位编译器仅使用16位。但这不是我的意思。即使是在16位模式下运行的32位x86处理器,其本机容量也只有16位。我的观点是,编译器具有的目标平台很重要。例如,如果您有80286的编译器,您仍将生成16位代码,因此具有16位整数。
junix

2
@junix我相信这正是我在回答中指出的内容。并不是操作系统指定整数有多少位。目标平台是编译器的属性,而不是它正在使用的操作系统或拥有的处理器的属性。
Ivaylo Strandjev 2013年

正如我在第一条评论中所写。“为32位计算机编译时为32位”。OP在他的帖子中写道“整数(对于32位计算机)”,据我了解,他并不是在指他的操作系统或他的机器,而是在指他的目标平台
junix

15

C语言定义为各种数据类型指定了最小范围。对于int,此最小范围是-32767至32767,这意味着an int必须至少为 16位宽。一个实现可以免费提供更广泛的int具有相应更广泛范围类型。例如,在我使用的SLES 10开发服务器上,范围是-2147483647至2137483647。

还有一些系统,在那里,使用16位的int类型(所有的世界是不是一个VAX 86),但也有很多是使用32位的int类型,也许几个是使用64位。

C语言旨在运行在不同的体系结构上。Java被设计为在隐藏这些架构差异的虚拟机中运行。


对于16位整数,它是-3276 8到32767。对于32位整数,它是-214748364 8到2147483647。范围从-2 ^(n bits-1)到+ 2 ^(n bits-1 ) - 1
mythicalcoder

3
@Maven:5.2.4.2.1- INT_MIN指定为-32767。不要假设二的补码。
约翰·博德

8

在Java的严格当量intlong int在C.

编辑:如果int32_t已定义,则在精度方面等效。long int保证java的精度int,因为可以保证至少32位。


您是对的,等效的是int32_t它是否由您的编译器定义
UmNyobe

7

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


1
好了,值得注意的是,典型的实现行为是使用“机器宽度”作为int。但limits.h有助于找出确切的真相
junix

3
但是实际上,我认为没有32位的int可以完成32位的C编译器。该标准可能允许int的编译器实现具有moronic性质,但是由于某些原因,没有人愿意制作moronic C编译器。趋势是制作有用的C编译器。
伦丁


4

其实在的位大小intshortlong 依赖于编译器实现。

例如,在我的Ubuntu 64位我short32位,当一个又一个32位的Ubuntu版本,它是16位。


2

它实际上很容易理解,您甚至可以使用Google计算器对其进行计算:您具有32位整数,而计算机是二进制的,因此每位(点)可以有2个值。如果您计算2 ^ 32,则会得到4,294,967,296。因此,如果将此数字除以2(因为其中一半是负整数,另一半是正整数),则得到2147483648。该数字是可以用32位表示的最大整数,尽管如果您注意,您会注意到2,147,483,648大于2,147,483,647乘以1,这是因为其中一个数字表示0,不幸的是它位于中间2 ^ 32不是一个奇数,因此中间没有一个数字,因此正整数的密码要少一个,而负数则是完整的一半1,147,483,648。

就是这样。它取决于机器,而不取决于语言。


2
这不是他要的...问题是“为什么C int与Java int不同?”
ElectronWill

并且在Java中,的大小与机器int 无关int== 32位带符号的二进制补码由Java语言规范定义,并刻在阳极氧化的unobtainium上。(好的,也许不是最后一点。)
Stephen C

1

在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位,如果您要使用特定大小的变量,特别是在编写涉及位操作的代码时,则应使用'Standard Integer Types'。

在Java中

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


2
您为C引用的值只是最小范围。
奥利弗·查尔斯沃思

@OliCharlesworth范围,从最小到最大。
Achintya Jha 2013年

6
我的意思是,每种类型的范围都可以大于上面引用的范围。
奥利弗·查尔斯沃思

3
C中没有任何东西称为__int32。Microsoft没有严格符合标准的C编译器,那么谁在乎他们的非C编译器如何工作?唯一相关的来源是ISO9899,即5.2.4.2.1“整数类型的大小”或7.20.2.1“精确宽度整数类型的限制”。没有一个与Microsoft goo兼容。
Lundin

2
C99确实将int32_t,int16_t等添加到标准中。不能与Microsoft的产品100%兼容,但是它们的工作方式相似。
询问Monica

-1

在标准C中,可以将INT_MAX用作最大的“ int”值,此常数必须在“ limits.h”中定义。如上所述,为其他类型定义了类似的常量(http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.5.html),这些常量与实现有关,但根据最小位数具有最小值按照标准中指定的每种类型。


5
这实际上不能解决OP的问题。另外,答案的核心部分实际上不应该埋在另一个站点上。
布拉德·科赫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.