-1

例如,Java 中的实数占用 8 个字节,而 C++ 中只占用 4 个字节。同样,对于字符,Java 占用 2 个字节,而 C++ 只占用 1 个字节。为什么它们的大小不同?

4

7 回答 7

9

你说的不是真的。C 和 C++ 没有任何固定大小的类型(除了 中指定的类型stdint.h)。

如果您没有从该声明中得到答案,这里有一个明确的:

“这是有区别的,因为 Java 包含固定大小的数据类型,而 C 和 C++ 中的所有基本数据类型都取决于程序编译的实际平台(机器架构 + 操作系统)。”

于 2012-08-02T09:45:33.257 回答
3

首先,虽然 C++ 中类型的实际大小取决于实现(并且有char9 位的实现),但在大多数支持这两种语言的平台上,float并且double在 C++ 和 Java 中具有完全相同的大小。

至于char,Java类型char或多或少对应 wchar_t于C++;从逻辑上讲,在大多数平台上应该是 4 字节,但由于各种历史原因,在 Windows、AIX 和 Java 运行时环境中只有 2 字节。

Java 没有真正等同于 C++char类型。

于 2012-08-02T09:53:38.047 回答
1

c++ 依赖于平台。例如 - int 将是字的大小 - 32 位或 64 位,取决于您的计算机有多新。

java 更通用 - 它在定义大小的 JVM 上运行。与 C# 相同的情况。两者都不取决于您拥有的操作系​​统和 CPU。

于 2012-08-02T09:47:08.673 回答
1

C++ 类型的大小并不是一成不变的。该标准说(3.9.1 基本类型):

声明为字符 (char) 的对象应足够大以存储实现的基本字符集的任何成员。

在那之后:

有五种标准有符号整数类型:“signed char”、“short int”、“int”、“long int”和“long long int”。在此列表中,每种类型提供的存储空间至少与列表中它前面的类型一样多。

<...>

有三种浮点类型:float、double 和 long double。double 类型提供的精度至少与 float 一样,long double 类型提供的精度至少与 double 一样。

如您所见,没有提到确切的值。

于 2012-08-02T09:47:58.613 回答
1

C 和 C++ 没有为许多类型定义大小,但通常float是 4 字节,就像在 Java 中一样,并且double是 8 字节,就像在 Java 中一样。C 没有标准的字节类型。

char在 C 中是一个字节,但不保证是有符号或无符号的。在 Java 中,它是 2 个字节并保证被签名以支持从 0 到 65535 的字符。

这里的不同之处在于 C 被设计为只需要支持 7 位 ASCII。Java 是在 16 位字符似乎足够时设计的。具有讽刺意味的是,Unicode 不超过 65535,所以 Java 现在也支持代码点以及使用多个chars

于 2012-08-02T09:49:43.377 回答
0

对于字符,Java 需要 2 个字节,但 C++ 只需要 1 个字节。

因为标准是这么说的。

对于Java:

Java 2 平台在 char 数组以及 String 和 StringBuffer 类中使用 UTF-16 表示。

对于C++:

sizeof(char)、sizeof(signed char) 和 sizeof(unsigned char) 为 1;

于 2012-08-02T09:52:20.613 回答
0

只是设计的语言选择使用不同的默认表示。没有比这更复杂的了。

例如,Java 中的大小char是出于使用 16 位 unicode 字符(需要 2 个字节)的愿望。这是一个平衡了许多权衡的设计决策:

  • 他们本可以使用 8 位字符(如在 C/C++ 中),但随后大量有用的 unicode 字符不适合单个字符。
  • 他们本可以使用 32 位字符在未来允许更多字符(预期UTF32)。但是大部分时间都会浪费很多这些位

请注意,您可以在 Java 中使用 4 字节浮点数 - 它被称为float而不是double(即 8 字节)

于 2012-08-02T09:46:35.037 回答