在C语言中,整数(对于32位机器)是32位,范围从-32768到+32767。在Java中,整数(长整型)也是32位,但范围从-2147483648到+2147483647。我不明白为什么在Java中范围不同,即使位数相同。有人能解释一下吗?
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
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
int foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo));
输出 2147483648
,并且 char 是一种无符号类型。 - howlgerInteger.MAX_VALUE + 1
在十六进制中是 0x80000000
,因为发生了溢出(等于 Integer.MIN_VALUE
)。如果将其转换为无符号(long),则符号位将被视为值位,因此它将是 2147483648
。
感谢您提供关于 char
的说明。char
是无符号的,您是正确的,但是 char
实际上并不用于计算,这就是为什么我从列表中删除它的原因。 - gaborschint
是“机器的自然宽度”,我会将其解释为在编译 32 位机器时为 32 位。 - junixint
的最小范围,确实是-32768
到+32767
,但没有注意到这只是一个最小值,实际范围取决于机器。而且,我在你的解释中缺少的正是与机器依赖性的链接。这就是我的第一条评论。 - junixint
,该最小范围为-32767到32767,这意味着int
至少需要16位宽度。实现可以提供更宽的int
类型,范围相应地更广。例如,在我工作的SLES 10开发服务器上,范围为-2147483647至2137483647。int
类型(全世界不是int
类型,也许有一些系统使用64位。INT_MIN
被指定为“-32767”。不要假设是二进制补码。 - John Bodeint
的严格等价于C语言中的long int
。
编辑:
如果定义了int32_t
,则在精度方面它是等价的。 long int
保证了Java int
的精度,因为它保证至少为32位。int32_t
。 - UmNyobe这是因为在C语言中,32位机器上的整数并不意味着使用32位存储它,也可能是16位。这取决于机器(实现相关)。
int
的位数。但是,limits.h
可以帮助我们找出确切的真相。 - junix实际上,int
、short
和long
的位数取决于编译器的实现。
例如,在我的Ubuntu 64位系统上,short
有32
位,而在另一个32位Ubuntu版本上则为16
位。
int
的大小不取决于计算机。 int
== 32位有符号的2补码由Java语言规范定义,并镌刻在阳极氧化[超不可得]的金属板上。(好吧,也许最后一句话不是很准确。) - Stephen Cunsigned 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(含)。