2012-01-19 35 views
2

任何人都可以告訴我,如果C中的短小範圍在不同的機器上有所不同。例如,如果short是2個字節,並且在1的補碼機中,short的範圍將是-32767 ~ 32767,而在2的補碼機中,範圍將是-32768 ~ 32767。提前致謝。機器之間「短」的範圍有所不同嗎?

+2

如果一個短爲4個字節,範圍將是-2147483648到2147483647左右。這實際上可能會發生。 – 2012-01-19 00:48:01

+0

讓我們知道當你找到那些1補充機器之一。 – 2012-01-19 00:53:00

+0

@GregHewgill你的意思是沒有1的補充機器? – John 2012-01-19 00:54:17

回答

10

是的,類型short的範圍和大小在不同的機器上有所不同。它甚至可以在同一臺機器上的不同實現上有所不同。

最常見的表示法是16位二進制補碼,沒有填充位或陷阱表示,範圍爲-32768到+32767。

C標準要求short覆蓋至少範圍-32767到+32767,但它可以更大。

我已經在short是32位(Cray T3E)甚至64位(Cray T90)的系統上工作過。

如果可能的話,您應該編寫不承擔short或任何其他預定義類型的特定範圍或大小的代碼。如果需要邊界,則使用SHRT_MINSHRT_MAX,如果需要邊界,則使用sizeof (short)(或更好的方法,sizeof obj,其中objshort類型的對象)。

如果你需要一個類型這正是位,使用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(和1int類型的話)。產生int類型的結果,如果int足夠寬以存儲該值,則結果爲32768。 (如果不是,溢出會導致不確定的行爲,但我們會忽略。)然後int價值32768轉換intshort存儲在x之前。

如果SHRT_MAX > 32767,沒有問題;該轉換產生預期值32768,其存儲在x中。

但如果SHRT_MAX == 32767(這是最常見的情況),則int32768short轉換產生一個實現定義值(或引發一個實現定義的信號),如C99第6.3節中描述1.3。

最常見的實際結果是-32768,如果系統使用二進制補碼(幾乎所有系統都這樣),則可以將其表示爲short。但嚴格來說,代碼是不可移植的,並且它可能會在x中存儲一些其他任意結果,或者如果實現決定提高信號(我不知道有任何這樣做),甚至可以終止您的程序。

+0

謝謝。所以溢出的值會因機器而異?例如,32767 + 1 = -32767或32768和C將不會處理它。 – John 2012-01-19 00:56:31

+0

@John:基本上,是的,但它比這更復雜。看到我更新的答案。 – 2012-01-19 01:17:26

1

通過適用於所有整數類型的標準中的相同語言(C99和C11中的整數表示形式爲6.2.6.2),它是允許的。

相關問題