例如,Java 中的实数占用 8 个字节,而 C++ 中只占用 4 个字节。同样,对于字符,Java 占用 2 个字节,而 C++ 只占用 1 个字节。为什么它们的大小不同?
7 回答
你说的不是真的。C 和 C++ 没有任何固定大小的类型(除了 中指定的类型stdint.h
)。
如果您没有从该声明中得到答案,这里有一个明确的:
“这是有区别的,因为 Java 包含固定大小的数据类型,而 C 和 C++ 中的所有基本数据类型都取决于程序编译的实际平台(机器架构 + 操作系统)。”
首先,虽然 C++ 中类型的实际大小取决于实现(并且有char
9 位的实现),但在大多数支持这两种语言的平台上,float
并且double
在 C++ 和 Java 中具有完全相同的大小。
至于char
,Java类型char
或多或少对应
wchar_t
于C++;从逻辑上讲,在大多数平台上应该是 4 字节,但由于各种历史原因,在 Windows、AIX 和 Java 运行时环境中只有 2 字节。
Java 没有真正等同于 C++char
类型。
c++ 依赖于平台。例如 - int 将是字的大小 - 32 位或 64 位,取决于您的计算机有多新。
java 更通用 - 它在定义大小的 JVM 上运行。与 C# 相同的情况。两者都不取决于您拥有的操作系统和 CPU。
C++ 类型的大小并不是一成不变的。该标准说(3.9.1 基本类型):
声明为字符 (char) 的对象应足够大以存储实现的基本字符集的任何成员。
在那之后:
有五种标准有符号整数类型:“signed char”、“short int”、“int”、“long int”和“long long int”。在此列表中,每种类型提供的存储空间至少与列表中它前面的类型一样多。
<...>
有三种浮点类型:float、double 和 long double。double 类型提供的精度至少与 float 一样,long double 类型提供的精度至少与 double 一样。
如您所见,没有提到确切的值。
C 和 C++ 没有为许多类型定义大小,但通常float
是 4 字节,就像在 Java 中一样,并且double
是 8 字节,就像在 Java 中一样。C 没有标准的字节类型。
char
在 C 中是一个字节,但不保证是有符号或无符号的。在 Java 中,它是 2 个字节并保证被签名以支持从 0 到 65535 的字符。
这里的不同之处在于 C 被设计为只需要支持 7 位 ASCII。Java 是在 16 位字符似乎足够时设计的。具有讽刺意味的是,Unicode 不超过 65535,所以 Java 现在也支持代码点以及使用多个char
s
只是设计的语言选择使用不同的默认表示。没有比这更复杂的了。
例如,Java 中的大小char
是出于使用 16 位 unicode 字符(需要 2 个字节)的愿望。这是一个平衡了许多权衡的设计决策:
- 他们本可以使用 8 位字符(如在 C/C++ 中),但随后大量有用的 unicode 字符不适合单个字符。
- 他们本可以使用 32 位字符在未来允许更多字符(预期UTF32)。但是大部分时间都会浪费很多这些位
请注意,您可以在 Java 中使用 4 字节浮点数 - 它被称为float
而不是double
(即 8 字节)