C++中的“短”与“int”相同吗?

Is `short` the same as `int` in C++?

本文关键字:中的 C++ int      更新时间:2023-10-16

我看过一些在 C# 中使用short的答案,但我不确定它们是否真的回答了我的问题。short C++int的另一个名字吗?我知道你可以做short int,这似乎能够处理很多值,但我仍然在开始,所以显然如果它是short它不是很多值。但是在这里的这个代码片段中:

short lives,aliensKilled;

它不使用int short,它只使用short。所以我想我的问题是,如果我不低于 -32,768 或超过 32,767,我可以用short代替int吗?

另外,用int替换short可以吗,只要我改变适当的东西,它就不会真正弄乱任何东西?(顺便说一句,livesaliensKilled都是变量名。

在C++(和 C(中,shortshort intint short 是同一类型的不同名称。 此类型保证的范围至少为 -32,767..+32,767。 (不,这不是错字。

在大多数现代系统上,short为 16 位,int为 32 位。 您可以用short替换int而不会产生不良影响,只要不超过short的范围。 在大多数现代系统上,超出short的范围通常会导致值环绕 - 标准不能保证此行为,您不应依赖它,尤其是现在常见的C++编译器将修剪包含有符号整数溢出的代码路径。

但是,在大多数情况下,用short替换int几乎没有好处。 如果我至少有数千个,我只会用short替换int。 使用short并不总是有好处,您可以减少使用的内存和所需的带宽,但您可能会增加从short转换为int所需的 CPU 周期数(当您对short进行算术时,它总是"提升"为int(。

short intint shortshort在C和C++中都是同义词。

这些工作原理与int类似,但范围较小(通常,但并非总是(16位。只要当数字由于 16 位而"环绕"时,没有代码依赖于转换(也就是说,没有计算超过最大值 (SHORT_MAX( 或低于最低值 (SHORT_MIN((,使用更大的类型(intlong(就可以了。

C++(以及C#和Objective-C以及C的其他直系后代(有一种古怪的方式来命名和指定原始整型。

如C++所述,shortint简单的类型说明符,可以与关键字longsignedunsigned混合搭配在充满组合的页面中的任何一个。

单一类型short int的一般模式是[signed] short [int],也就是说signedint关键字是可选的。

请注意,即使intshort在特定平台上的大小相同,它们仍然是不同的类型。 int 的范围至少与 short 相同,因此它在数字上是一个直接替换,但您不能在需要short *short &的地方使用int *int &。除此之外,C++还提供各种用于处理类型的机器......对于一个围绕short编写的大型程序,转换为int可能需要一些工作。

另请注意,声明某些内容short没有任何好处,除非您确实有理由保存几个字节。这是糟糕的风格,会导致溢出错误,甚至会降低性能,因为今天的 CPU 没有针对 16 位操作进行优化。正如 Dietrich 所指出的,根据指定 C 算术语义的疯狂方式,在执行任何操作之前,short被向上转换为 int,然后如果结果被分配回short,它又被转换回来。这种舞蹈通常没有效果,但仍可能导致编译器警告甚至更糟。

无论如何,最佳做法是为您需要完成的任何工作typedef自己的类型。默认情况下始终使用int,并利用int16_tuint32_t来自<stdint.h>(自C++11以来<cstdint>(等,而不是依赖依赖于平台的shortlong

是的,short 相当于 short int,它至少使用 2 个字节,但如果你保持在这个范围内,你可以用 short 替换 int,没有任何问题。

是的,您可以使用它。 短 = 短内。 有符号 -32768 到 32767 和无符号 0 到 65535 。

的长度最多可以有两个字节。在 int 为两个字节的机器上,shortint 具有相同的范围,即 -32767 到 +32767。对于大多数新平台,int 是 4 个字节,迎合了更大的值范围。

我建议使用显式声明,例如 int16_t 简称和 int32_t 表示 int,以避免任何混淆。

另请注意,对于以下代码:

short a = 32767;
a++;
cout << a;

它将打印 -32768。

因此,如果您超过其限制,它将"返回"计数。