整数的最大值

sta*_*ser 268 c java integer max bit

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

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

gab*_*sch 360

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
Run Code Online (Sandbox Code Playgroud)

爪哇,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
Run Code Online (Sandbox Code Playgroud)

  • Java 8现在也有未签名的Integer:http://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html (13认同)
  • C标准还规定了INT_MAX,LONG_MAX等的最小值. (10认同)
  • @GaborSch在Java中,`int foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo));`打印`2147483648`和[_char_是无符号类型](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html) (5认同)
  • 谢谢,@ jkbkot,很高兴知道.虽然看起来表示仍然是签名的,但某些无符号操作是作为函数实现的.很难添加两个未签名的`int`s ... (4认同)
  • @howlger`Integger.MAX_VALUE + 1`是十六进制的"0x80000000",因为溢出(等于`Integer.MIN_VALUE`).如果将其转换为无符号(long),则符号位将被视为值位,因此它将为"2147483648".谢谢你的`char`笔记.`char`是无符号的,你是对的,但char并不真正用于计算,这就是为什么我把它从列表中删除了. (2认同)

Kos*_*Kos 71

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

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

  • 我认为我的观点是,由于C没有取幂运算符,我认为不应该将特定的部分格式化为代码.:) (4认同)
  • 我修正了你的指数,"**"甚至不是C,在我看来并不是很清楚.:) (2认同)

izo*_*ica 18

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

  • 这取决于编译器,而不是我认为的机器.例如,我在64位机器上安装了16位编译器. (7认同)
  • @junix 我相信这正是我在回答中指出的。指定整数有多少位的不是操作系统。目标平台是编译器的属性,而不是它正在运行的操作系统或您拥有的处理器。 (2认同)

Joh*_*ode 14

C语言定义指定各种数据类型的最小范围.因为int,该最小范围是-32767到32767,这意味着int必须至少为 16位宽.实现可以自由地提供int具有相应更宽范围的更宽类型.例如,在我使用的SLES 10开发服务器上,范围是-2147483647到2137483647.

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

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

  • @Maven:5.2.4.2.1 - `INT_MIN`被指定为`-32767`.不要假设两个补码. (3认同)

Bri*_*pin 7

海报将他们的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


UmN*_*obe 6

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

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


Blu*_*e16 6

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

  • 但实际上,我认为没有32位的C编译器没有int作为32位.该标准可能允许int的编译器实现具有moronic性质,但由于某种原因,没有人想要制作一个moronic C编译器.趋势是制作有用的C编译器. (2认同)

Ale*_*lex 5

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

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


小智 5

它实际上很容易理解,您甚至可以使用谷歌计算器来计算它: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 不同?” (5认同)
  • 在 Java 中,`int` 的大小**不**取决于机器。`int` == 32 位有符号、补码由 Java 语言规范定义,并刻在阳极氧化 [unobtainium](https://en.wikipedia.org/wiki/Unobtainium) 的纸张上。(好吧,也许不是最后一点。) (2认同)