机器之间的"short"范围是否不同?



谁能告诉我 C 中的短范围是否在不同的机器上不同。例如,如果短数是 2 个字节,并且在 1 的补码机中,短-32767 ~ 32767的范围将而在 2 的补码机中,范围将是-32768 ~ 32767的。提前谢谢。

是的,short类型的范围和大小在不同的机器上有所不同。 它甚至可能在同一台计算机上的不同实现中有所不同。

最常见的表示形式

是 16 位,二进制补码,没有填充位或陷阱表示形式,范围为 -32768 至 +32767。

C 标准要求short至少涵盖 -32767 到 +32767 的范围,但它可以更大。

我曾在short为32位(Cray T3E(甚至64位(Cray T90(的系统上工作过。

如果可能的话,你应该编写的代码不假定short 或任何其他预定义类型的特定范围或大小。 如果需要边界,请使用 SHRT_MINSHRT_MAX 中定义的 <limits.h> 中定义,如果需要大小,请使用 sizeof (short) 、(或更好的是,sizeof obj 其中 obj 是类型 short 的对象(。

如果需要正好是 16 位的类型,请使用 int16_t ,在 <stdint.h><inttypes.h> 中定义。 (这些标头是在 1999 版的 C 标准中添加的,但大多数编译器应该支持它们。

回应您询问溢出的评论:

当您谈论 short 型时,溢出问题变得有点棘手。 像 32767 这样的整数文字从来都不是 short 类型;它们总是int型或更大的类型。 算术运算符的操作数首先应用"通常的算术转换"; short操作数被悄悄提升为int.

在 C 中,类型 short 没有+运算符

所以考虑一下:

short x = 32767;
x = x + 1;

在表达式x + 1中,操作数xshort 提升为 int(并且1已经是 int 类型(。 这会产生类型 int 的结果,如果int足够宽以存储该值,则该结果将被32768。 (如果不是,溢出会导致未定义的行为,但我们将忽略它。 然后将32768 int值从 int 转换为 short,然后再存储在 x 中。

如果SHRT_MAX > 32767,则没有问题;转换产生32768的期望值,存储在x中。

但是,如果SHRT_MAX == 32767(这是最常见的情况(,则将int32768转换为short会产生实现定义的值(或引发实现定义的信号(,如C99第6.3.1.3节中所述。

最常见的是,实际结果是 -32768 ,如果系统使用二进制补码(几乎所有系统都这样做(,则可以表示为short。 但严格来说,代码是不可移植的,它可以在x中存储其他一些任意结果,如果实现决定发出信号,甚至终止你的程序(我不知道有没有人这样做(。

允许使用适用于所有

整数类型的标准中的相同语言(C99 和 C11 中的整数表示形式均为 6.2.6.2(。

相关内容

最新更新