任何人都可以告訴我,如果C中的短小範圍在不同的機器上有所不同。例如,如果short是2個字節,並且在1的補碼機中,short的範圍將是-32767 ~ 32767
,而在2的補碼機中,範圍將是-32768 ~ 32767
。提前致謝。機器之間「短」的範圍有所不同嗎?
回答
是的,類型short
的範圍和大小在不同的機器上有所不同。它甚至可以在同一臺機器上的不同實現上有所不同。
最常見的表示法是16位二進制補碼,沒有填充位或陷阱表示,範圍爲-32768到+32767。
C標準要求short
覆蓋至少範圍-32767到+32767,但它可以更大。
我已經在short
是32位(Cray T3E)甚至64位(Cray T90)的系統上工作過。
如果可能的話,您應該編寫不承擔short
或任何其他預定義類型的特定範圍或大小的代碼。如果需要邊界,則使用SHRT_MIN
和SHRT_MAX
,如果需要邊界,則使用sizeof (short)
(或更好的方法,sizeof obj
,其中obj
是short
類型的對象)。
如果你需要一個類型這正是位,使用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
類型的結果,如果int
足夠寬以存儲該值,則結果爲32768
。 (如果不是,溢出會導致不確定的行爲,但我們會忽略。)然後int
價值32768
是轉換從int
到short
存儲在x
之前。
如果SHRT_MAX > 32767
,沒有問題;該轉換產生預期值32768
,其存儲在x
中。
但如果SHRT_MAX == 32767
(這是最常見的情況),則int
值32768
到short
轉換產生一個實現定義值(或引發一個實現定義的信號),如C99第6.3節中描述1.3。
最常見的實際結果是-32768
,如果系統使用二進制補碼(幾乎所有系統都這樣),則可以將其表示爲short
。但嚴格來說,代碼是不可移植的,並且它可能會在x
中存儲一些其他任意結果,或者如果實現決定提高信號(我不知道有任何這樣做),甚至可以終止您的程序。
謝謝。所以溢出的值會因機器而異?例如,32767 + 1 = -32767或32768和C將不會處理它。 – John 2012-01-19 00:56:31
@John:基本上,是的,但它比這更復雜。看到我更新的答案。 – 2012-01-19 01:17:26
通過適用於所有整數類型的標準中的相同語言(C99和C11中的整數表示形式爲6.2.6.2),它是允許的。
- 1. sh在範圍之間的隨機數
- 2. 在FreeBSD和Linux中,Shell for-loop的範圍有所不同嗎?
- 3. 軌道4的範圍:搶相反範圍之間的所有記錄
- 4. 查找定義的一組範圍之外的所有範圍
- 5. Excel之間的Excel返回相同範圍內的不同值
- 6. 不同的文件有不同的範圍嗎?
- 7. 控制器之間的處理範圍
- 8. 獲得隨機沒有範圍之間沒有重複
- 9. ORACLE SQL顯示所有的日期/時間範圍,如果另一個時間戳不在這個範圍之間不同的時間戳下降
- 10. MYSQL - 不在所有範圍
- 11. 之間/時間範圍LINQ
- 12. 彙總數值範圍之間的所有值
- 13. 如何選擇日期範圍之間的所有日期?
- 14. TSQL - 獲取月/年範圍之間的所有結果
- 15. 獲取日期範圍之間的所有行與分日期
- 16. 返回日期範圍之間的所有電流記錄
- 17. Dispaying兩個範圍之間的所有數據點
- 18. 返回兩個範圍之間的所有匹配數組
- 19. 列出範圍之間的所有日期
- 20. 返回多個日期範圍之間的所有日期
- 21. 如何提醒所有動態ID之間的範圍
- 22. 給定範圍之間的所有日期
- 23. 如何查找引號之間的所有字符串的所有範圍
- 24. x和y之間的隨機數,不包括數字範圍
- 25. 隨機數範圍的不同概率
- 26. 每個用戶的(不同)日期範圍之間的VisitId
- 27. 不同的IP組之間的IP範圍
- 28. 隨機時間的兩倍(範圍)的iOS SDK之間
- 29. API範圍和用戶要求之間的不同在identityserver4
- 30. 在時間範圍之外選擇不同的行
如果一個短爲4個字節,範圍將是-2147483648到2147483647左右。這實際上可能會發生。 – 2012-01-19 00:48:01
讓我們知道當你找到那些1補充機器之一。 – 2012-01-19 00:53:00
@GregHewgill你的意思是沒有1的補充機器? – John 2012-01-19 00:54:17