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

Joh*_*ohn 2 c

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

Kei*_*son 10

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

最常见的表示是16位,二进制补码,没有填充位或陷阱表示,范围为-32768到+32767.

C标准要求short,以覆盖至少一个范围的-32767〜32767,但它可以是更大的.

我曾经研究过short32位(Cray T3E)甚至64位(Cray T90)的系统.

如果可能的话,您应该编写不假定特定范围或大小的代码short,或者用于任何其他预定义类型的代码.如果需要边界,请使用SHRT_MINSHRT_MAX定义<limits.h>,如果需要大小,则使用sizeof (short)(或更好地,类型对象sizeof obj在哪里).objshort

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

回应你的评论询问溢出:

当你谈论类型时,溢出的问题会变得有点棘手short.类似的整数文字32767从不类型short; 他们总是类型int或更大的东西.算术运算符的操作数首先应用"常用算术转换"; short操作数被悄然提升为int.

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

所以考虑一下:

short x = 32767;
x = x + 1;
Run Code Online (Sandbox Code Playgroud)

在表达式中x + 1,操作数x从提升shortint(并且1已经是类型int).其产生类型的结果int,这将是32768如果int足够宽以存储该值.(如果不是,溢出会导致不确定的行为,但我们会忽略.)然后int32768转换intshort存储在之前x.

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

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

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