在 C 中,整数(对于 32 位机器)是 32 位,范围从 -32,768 到 +32,767。在 Java 中,整数(长整数)也是 32 位,但范围从 -2,147,483,648 到 +2,147,483,647。
我不明白 Java 中的范围有何不同,即使位数相同。有人可以解释一下吗?
在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 中,整数(对于 32 位机器)是 32 位,范围从 -32768 到 +32767。
错误的。 2 的补码表示形式的 32 位有符号整数的范围为 -231 到 231-1,等于 -2,147,483,648 到 2,147,483,647。
32 位整数的范围从 -2,147,483,648 到 2,147,483,647。然而,您在 32 位机器上这一事实并不意味着您的 C
编译器使用 32 位整数。
int
是“机器的自然宽度”,在编译 32 位时我会将其解释为 32 位机器。
语言定义为各种数据类型指定了最小范围。对于 int
,此最小范围是 -32767 到 32767,这意味着 int
必须至少 16 位宽。一个实现可以自由地提供更广泛的 int
类型和相应的更广泛的范围。例如,在我工作的 SLES 10 开发服务器上,范围是 -2147483647 到 2137483647。
仍然有一些系统使用 16 位 int
类型(All The World Is Not A VAX x86),但有很多使用 32 位int
类型,可能还有一些使用 64 位。
语言被设计为在不同的体系结构上运行。 Java 被设计为在隐藏了这些架构差异的虚拟机中运行。
INT_MIN
指定为 -32767
。不要假设二进制补码。
java int
的严格等价物是 C 中的 long int
。
编辑:如果定义了 int32_t
,那么它在精度方面是等效的。 long int
保证 java int
的精度,因为它保证大小至少为 32 位。
int32_t
海报混淆了他们的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
那是因为在 C 中 - 32 位机器上的整数并不意味着 32 位用于存储它,它也可能是 16 位。它取决于机器(依赖于实现)。
int
使用“机器宽度”。但是 limits.h
有助于找出确切的真相
实际上,int
、short
、long
的位大小取决于编译器实现。
例如,在我的 Ubuntu 64 位上,我在 32
位中有 short
,而在另一个 32 位 Ubuntu 版本上,它是 16
位。
它实际上很容易理解,你甚至可以用谷歌计算器来计算它:一个 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 中,__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 中,您可以使用 INT_MAX 作为最大“int”值,此常量必须在“limits.h”中定义。为其他类型 (http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.5.html) 定义了类似的常量,如上所述,这些常量依赖于实现,但根据标准中规定的每种类型的最小位具有最小值。
不定期副业成功案例分享
int
...int foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo));
打印2147483648
和 char is an unsigned typeInteger.MAX_VALUE + 1
是十六进制的0x80000000
,因为溢出(并且等于Integer.MIN_VALUE
)。如果将其转换为无符号(长),符号位将被视为值位,因此它将是2147483648
。感谢您的char
说明。char
是无符号的,你是对的,但 char 并没有真正用于计算,这就是我将它从列表中删除的原因。