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