3 回答

TA貢獻1725條經驗 獲得超8個贊
C ++使用C標準中定義的限制(C ++:18.3.2(c.limits),C:5.2.4.2.1):
LONG_MIN -2147483647 // -(2^31 - 1)
LONG_MAX +2147483647 // 2^31 - 1
因此,可以確保long至少為32位。
而且,如果您想沿著漫長的路線了解LONG_MIN/ 是否LONG_MAX可以用a表示long,則必須查看C ++標準中的18.3.1.2(numeric.limits.members):
static constexpr T min() throw(); // Equivalent to CHAR_MIN, SHRT_MIN, FLT_MIN, DBL_MIN, etc.
static constexpr T max() throw(); // Equivalent to CHAR_MAX, SHRT_MAX, FLT_MAX, DBL_MAX, etc.
我將腳注移到了注釋中,因此它與標準中出現的不完全相同。但這基本上意味著std::numeric_limits<long>::min()==LONG_MIN==(long)LONG_MIN和std::numeric_limits<long>::max()==LONG_MAX==(long)LONG_MAX。
因此,即使C ++標準未指定(帶符號的)負數的按位表示,它也必須是二進制補碼,并且總共需要32位存儲,或者它具有顯式符號位,這意味著它具有也有32位存儲。

TA貢獻1875條經驗 獲得超3個贊
答案肯定是。閱讀我的OP和所有評論以了解確切原因,但這是簡短版本。如果您對此有疑問或疑問,我建議您閱讀整個主題和所有評論。否則,請接受以下說法:
C ++標準包括C標準的部分,包括用于定義LONG_MIN和LONG_MAX
LONG_MIN 定義為不大于 -2147483647
LONG_MAX 被定義為不小于 +2147483647
在C ++中,整數類型以二進制形式存儲在基礎表示中
為了表示-2147483647和+2147483647二進制,則需要32位。
A C ++長被保證是能夠代表最小范圍LONG_MIN通過LONG_MAX
因此,a long必須至少為32位1。
編輯:
LONG_MIN并LONG_MAX具有第5.2.4.2.1節中C標準(ISO / IEC 9899:TC3)規定的大小的值:
其實現定義的值在幅度上應等于或大于所示的(絕對值),并帶有相同的符號
— minimum value for an object of type long int
LONG_MIN -2147483647 // -(2 ^ 31 - 1)
— maximum value for an object of type long int
LONG_MAX +2147483647 // 2 ^ 31 - 1
1 32位:這并不意味著sizeof (long) >= 4,因為一個字節不一定是8位。根據標準,字節是一些未指定(平臺定義)的位數。盡管大多數讀者會發現這很奇怪,但實際的硬件CHAR_BIT是16或32。

TA貢獻1830條經驗 獲得超3個贊
但是Alf和其他人明確指出long至少必須為32位。這就是我要建立的。C ++標準明確指出未指定字節中的位數??赡苁?、8、16、42 ...那么,如何將數字LONG_MIN-LONG_MAX調整為至少32位呢?
您需要在值表示形式中使用32位,以便至少獲得那么多的位模式。并且由于C ++需要整數的二進制表示(標準中明確的語言,第3.9.1 / 7節),因此QED
- 3 回答
- 0 關注
- 644 瀏覽
添加回答
舉報