机器之间的“短”范围是否不同?

时间:2012-01-19 00:44:55

标签: c

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

2 个答案:

答案 0 :(得分:10)

是的,类型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中,操作数xshort升级为int(而1已经是int类型) 。这会产生int类型的结果,如果32768足够宽以存储该值,则结果为int。 (如果不是,溢出会导致未定义的行为,但我们会忽略它。)然后int32768从<{1}} 转换到在int存储之前short

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

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

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

答案 1 :(得分:1)

允许使用适用于所有整数类型的标准中的相同语言(C99和C11中的整数表示为6.2.6.2)。