ChatGPT解决这个技术问题 Extra ChatGPT

整数的最大值

在 C 中,整数(对于 32 位机器)是 32 位,范围从 -32,768 到 +32,767。在 Java 中,整数(长整数)也是 32 位,但范围从 -2,147,483,648 到 +2,147,483,647。

我不明白 Java 中的范围有何不同,即使位数相同。有人可以解释一下吗?

要在 Java 中获取 int 的最大值和最小值,请使用 Integer.MAX_VALUE 和 Integer.MIN_VALUE
@stackuser - 你的问题的一些很好的答案 - 你应该接受一个:)
@DarraghEnright 他最后一次出现是在 2015 年 3 月,我怀疑他会回来 :(
@Adrian 哈哈-我猜不是!我想会发生一点。我一直认为 SO 可以在某些条件下轻松地自动接受答案 - 问题超过一定年龄,OP 是 AWOL 并且有一个明显有用的答案,并且有大量的支持。
@DarraghEnright 同意。但是 OP 大约两周前就在这里,他有机会接受,所以从技术上讲,他并没有离开。

g
gaborsch

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 Language Specification 确定数据类型的表示。

顺序为:byte 8 位,short 16 位,int 32 位,long 64 位。所有这些类型都是签名的,没有未签名的版本。但是,位操作将数字视为无符号数(即正确处理所有位)。

字符数据类型 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

C 标准还指定了 INT_MAX、LONG_MAX 等的最小值。
Java 8 现在也有无符号整数:docs.oracle.com/javase/8/docs/api/java/lang/Integer.html
谢谢@jkbkot,很高兴知道这一点。虽然看起来表示仍然是有符号的,但某些无符号操作是作为函数实现的。很难添加两个无符号 int...
@GaborSch 在 Java 中,int foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo)); 打印 2147483648char is an unsigned type
@howlger Integer.MAX_VALUE + 1 是十六进制的 0x80000000,因为溢出(并且等于 Integer.MIN_VALUE)。如果将其转换为无符号(长),符号位将被视为值位,因此它将是 2147483648。感谢您的 char 说明。 char 是无符号的,你是对的,但 char 并没有真正用于计算,这就是我将它从列表中删除的原因。
u
unwind

在 C 中,整数(对于 32 位机器)是 32 位,范围从 -32768 到 +32767。

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


I
Ivaylo Strandjev

32 位整数的范围从 -2,147,483,648 到 2,147,483,647。然而,您在 32 位机器上这一事实并不意味着您的 C 编译器使用 32 位整数。


至少我的 Kernighan 先生和 Ritchies 先生的副本“C 编程语言”在 A4.2 中说 int 是“机器的自然宽度”,在编译 32 位时我会将其解释为 32 位机器。
这取决于编译器,而不是我相信的机器。例如,我在 64 位机器上安装了 16 位编译器。
当然,您的 16 位 x86 代码的 16 位编译器只使用了 16 位。但这不是我的意思。即使是在 16 位模式下运行的 32 位 x86 处理器,其本机容量也只有 16 位。我的观点是编译器的目标平台很重要。例如,如果您有 80286 的编译器,您仍将生成 16 位代码,因此具有 16 位整数。
@junix我相信这正是我在回答中指出的。指定整数有多少位的不是操作系统。目标平台是编译器的属性,而不是它正在运行的操作系统或您拥有的处理器。
正如我在第一条评论中所写。 “为 32 位机器编译时为 32 位”。 OP 在他的帖子“整数(用于 32 位机器)”中写道,所以据我了解,他指的不是他的操作系统或他的机器,而是指他的目标平台
J
John Bode

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

仍然有一些系统使用 16 位 int 类型(All The World Is Not A VAX x86),但有很多使用 32 位int 类型,可能还有一些使用 64 位。

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


对于 16 位 int,它是 -32768 到 32767。对于 32 位 int,它是 -2147483648 到 2147483647。范围指定为 -2^(n bits-1) 到 +2^(n bits-1) - 1.
@Maven:5.2.4.2.1 - INT_MIN 指定为 -32767。不要假设二进制补码。
U
UmNyobe

java int 的严格等价物是 C 中的 long int

编辑:如果定义了 int32_t,那么它在精度方面是等效的。 long int 保证 java int 的精度,因为它保证大小至少为 32 位。


你是对的,如果它是由你的编译器定义的,则相当于 int32_t
B
Brill Pappin

海报混淆了他们的java类型。在 java 中,他的 C in 是一个短:short(16 位)= -32768 到 32767 int(32 位)= -2,147,483,648 到 2,147,483,647

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html


B
BlueLettuce16

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


嗯,值得注意的是,典型的实现行为是对 int 使用“机器宽度”。但是 limits.h 有助于找出确切的真相
但实际上,我认为 32 位的 C 编译器从来没有在没有 int 的情况下被制作为 32 位。该标准可能允许 int 的编译器实现具有白痴性质,但出于某种原因,没有人愿意制作白痴 C 编译器。趋势是制作有用的 C 编译器。
A
Alex

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

例如,在我的 Ubuntu 64 位上,我在 32 位中有 short,而在另一个 32 位 Ubuntu 版本上,它是 16 位。


E
Emos Turi

它实际上很容易理解,你甚至可以用谷歌计算器来计算它:一个 int 有 32 位,而计算机是二进制的,因此每个位可以有 2 个值(点)。如果您计算 2^32,您将得到 4,294,967,296。所以如果你把这个数字除以 2,(因为其中一半是负整数,另一半是正整数),那么你得到 2,147,483,648。这个数字是可以用 32 位表示的最大 int,尽管如果你注意你会注意到 2,147,483,648 比 2,147,483,647 大 1,这是因为其中一个数字代表 0,不幸的是 2^ 32 不是奇数,因此中间不只有一个数字,因此正整数的密码少一个,而负整数则得到完整的一半 2,147,483,648。

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


这不是他要求的……问题是“为什么 C int 与 Java int 不同?”
而在 Java 中,int 的大小不取决于机器。 int == 32 位有符号,二进制补码由 Java 语言规范定义,并刻在阳极氧化的 unobtainium 板上。 (好吧,也许不是最后一点。)
A
Achintya Jha

在 C 中,__int32 的范围是 –2147483648 到 2147483647。See here for full ranges.

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(含)。


您为 C 引用的值只是最小范围。
@OliCharlesworth 范围从最小值到最大值。
我的意思是,每种类型的范围都允许大于您上面引用的范围。
中没有称为 __int32 的东西。微软没有严格遵守的 C 编译器,那么谁在乎他们的非 C 编译器是如何工作的呢?唯一相关的来源是 ISO9899,5.2.4.2.1“整数类型的大小”或 7.20.2.1“精确宽度整数类型的限制”。其中没有一个与 Microsoft goo 兼容。
C99 确实在标准中添加了 int32_t、int16_t 等。不是 100% 与 Microsoft 的添加兼容,但它们以类似的方式工作。
C
Carlos UA

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


这并没有真正解决OP的问题。此外,答案的核心部分真的不应该埋在另一个网站上。