有人能告诉我,不同机器的C短路范围是否不同。例如,如果short是2个字节,并且在1的补码机器中,short的范围将是-32767 ~ 32767
,而在2的补码机器中,范围将是-32768 ~ 32767
。提前谢谢。
答案 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
中,操作数x
从short
升级为int
(而1
已经是int
类型) 。这会产生int
类型的结果,如果32768
足够宽以存储该值,则结果为int
。 (如果不是,溢出会导致未定义的行为,但我们会忽略它。)然后int
值32768
从<{1}} 转换到在int
存储之前short
。
如果x
,则没有问题;转换产生SHRT_MAX > 32767
的预期值,该值存储在32768
。
但如果x
(这是最常见的情况),那么将SHRT_MAX == 32767
值int
转换为32768
会产生实现定义的值(或引发实现定义的信号),如C99第6.3.1.3节所述。
最常见的是,实际结果为short
,如果系统使用二进制补码(几乎所有系统都这样做),则可以表示为-32768
。但严格来说,代码不可移植,并且它可以在short
中存储其他任意结果,或者如果实现决定发出信号,我甚至会终止你的程序(我不会知道任何那样做。)
答案 1 :(得分:1)
允许使用适用于所有整数类型的标准中的相同语言(C99和C11中的整数表示为6.2.6.2)。