谁能告诉我 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_MIN
和 SHRT_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
中,操作数x
从 short
提升为 int
(并且1
已经是 int
类型(。 这会产生类型 int
的结果,如果int
足够宽以存储该值,则该结果将被32768
。 (如果不是,溢出会导致未定义的行为,但我们将忽略它。 然后将32768
int
值从 int
转换为 short
,然后再存储在 x
中。
如果SHRT_MAX > 32767
,则没有问题;转换产生32768
的期望值,存储在x
中。
但是,如果SHRT_MAX == 32767
(这是最常见的情况(,则将int
值32768
转换为short
会产生实现定义的值(或引发实现定义的信号(,如C99第6.3.1.3节中所述。
最常见的是,实际结果是 -32768
,如果系统使用二进制补码(几乎所有系统都这样做(,则可以表示为short
。 但严格来说,代码是不可移植的,它可以在x
中存储其他一些任意结果,如果实现决定发出信号,甚至终止你的程序(我不知道有没有人这样做(。
整数类型的标准中的相同语言(C99 和 C11 中的整数表示形式均为 6.2.6.2(。