-3

在 C 中整型和短整型变量是相同的:都从 -32768 到 32767,并且两者所需的字节也相同,即 2。

那么为什么需要两种不同的类型呢?

4

5 回答 5

6

C 语言中的基本整数类型没有严格定义的范围。它们只有语言标准规定的最小范围要求。这意味着您关于intshort具有相同范围的断言通常是不正确的。

尽管 和 的最小范围要求int相同short,但在典型的现代实现中,范围int通常大于 的范围short

于 2013-07-09T22:25:55.773 回答
2

据我所知,该标准仅保证 sizeof(short) <= sizeof(int) <= sizeof(long) 。所以 short 和 int 都可以是相同的,但不是必须的。32 位编译器通常有 2 个字节的短字节和 4 个字节的整数字节。

于 2013-07-09T22:20:05.070 回答
0

int和的保证最小范围short相同。然而,一个实现可以自由定义short一个更小的范围int(只要它仍然满足最小值),这意味着它可能会占用与int1相同或更小的存储空间。该标准是这样说的int

“普通”int对象具有执行环境架构所建议的自然大小。

总而言之,这意味着(对于落在 -32767 到 32767 范围内的值)可移植代码int在几乎所有情况下都应该首选。例外情况是存储大量值的地方,因此需要考虑的可能short是占用的存储空间较小。


1. 当然,病态实现可以自由定义 ashort的大小(以字节为单位)大于int,只要它仍然具有相等或更小的范围 - 但是没有充分的理由这样做。

于 2013-07-09T22:39:17.633 回答
0

C++ 标准(和 C 标准,有一个非常相似的段落,但引用来自 C++11 草案规范的 n3337 版本):

第 3.9.1 节,第 2 点:

有五种标准有符号整数类型:“signed char”、“short int”、“int”、“long int”和“long long int”。在此列表中,每种类型提供的存储空间至少与列表中它前面的类型一样多。也可能有实现定义的扩展有符号整数类型。标准和扩展的有符号整数类型统称为有符号整数类型。普通整数具有执行环境架构所建议的自然大小;提供其他有符号整数类型以满足特殊需要。

不同的架构具有不同大小的“自然”整数,因此 16 位架构自然会计算 16 位值,而 32 位或 64 位架构将使用 32 位或 64 位整数。这是编译器生产者的选择(或特定架构的 ABI 定义者,这往往是由操作系统和该架构的“主要”编译器生产者组合形成的决定)。

在现代 C 和 C++ 中,有一些类型int32_t可以保证正好是 32 位。这有助于便携性。如果这些类型不够用(或者项目使用的不是那么现代的编译器),最好不要int在需要特定精度/大小的数据结构或类型中使用,而是定义 a uint32orint32或类似的东西,可以在所有需要尺寸的地方使用。

在很多代码中,变量的大小并不重要,因为这个数字在这样一个范围内,几千比你需要的要多 - 例如文件名中的字符数由操作系统定义,而且我不知道文件名/路径超过 4K 字符的任何操作系统 - 因此可以达到至少 32K 的 16、32 或 64 位值非常适合计算它 - 这并不重要它是什么尺寸 - 所以在这里我们应该使用int,而不是尝试使用特定尺寸。int在编译器中应该是一种“高效”的类型,因此应该有助于提供良好的性能,如果使用short,某些体系结构会运行得更慢,而使用long.

于 2013-07-09T22:41:08.670 回答
-1

对于 16 位 IBM 兼容 PC,它们都是相同的。但是,不确定它在其他硬件上是否也相同。

VAX 类型的系统被称为虚拟地址扩展,它们以不同的方式处理所有这两个变量。短整数占用 2 个字节,整数占用 4 个字节。

所以这就是我们有 2 个不同但相同的变量及其属性的原因。

对于台式机和笔记本电脑的一般用途,我们使用整数。

于 2013-07-09T22:17:14.737 回答