亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

是否保證“ long”至少為32位?

是否保證“ long”至少為32位?

C++
慕尼黑8549860 2019-12-02 09:52:27
通過閱讀C ++標準,我一直了解C ++中不可分割的基本類型的大小如下:sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)我從3.9.1 / 2推論得出:有四種有符號整數類型:“ signed char”,“ short int”,“ int”和“ long int”。在此列表中,每種類型提供的存儲量至少與列表中位于其前的存儲量一樣。普通整數具有執行環境的體系結構建議的自然大小此外,char3.9.1 /將其大小描述為:足夠大,可以存儲實現的基本字符集的任何成員。1.7 / 1對此進行了更具體的定義:C ++內存模型中的基本存儲單元是字節。字節至少大到足以包含基本執行字符集的任何成員,并且由連續的位序列組成,其位數由實現定義。這使我得出以下結論:1 == sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)其中sizeof告訴我們類型是多少個字節。此外,實現定義的是一個字節中有多少位。我們大多數人可能習慣于處理8位字節,但標準表示n字節中有位。Alf P. Steinbach 在這篇文章中說:保證(至少)32位長。我了解根據標準理解的C ++中基本類型的大小,這無可厚非。通常,由于初學者是錯誤的,所以我會輕視此聲明,但是由于這是Alf,我認為值得進一步研究。那么,你怎么說呢?標準是否保證長度至少為32位?如果是這樣,請具體說明此保證的方式。我只是看不到。C ++標準專門說,要了解C ++,您必須了解C(1.2 / 1)1C ++標準隱式定義的值的最小極限的long能容納是LONG_MIN- LONG_MAX 2因此,無論a long有多大,它都必須足夠大以將LONG_MIN保持為LONG_MAX。但是Alf和其他人明確指出long至少必須為32位。這就是我要建立的。C ++標準明確指出,未指定字節中的位數(可以是4、8、16、42)。那么如何從能夠容納這些位數LONG_MIN-LONG_MAX到至少32位進行連接?(1)1.2 / 1:以下引用文件對于應用本文件必不可少。凡是注日期的引用文件,僅所引用的版本適用。凡是不注日期的引用文件,其最新版本(包括所有的修改單)適用于本標準。ISO / IEC 2382(所有部分),信息技術–詞匯ISO / IEC 9899:1999,編程語言– CISO / IEC 10646-1:2000,信息技術–通用多八位編碼字符集(UCS)–第1部分:體系結構和基本多語言平面(2)定義<climits>為:LONG_MIN -2147483647 // -(2^31 - 1)LONG_MAX +2147483647 //   2^31 - 1
查看完整描述

3 回答

?
qq_遁去的一_1

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位存儲。


查看完整回答
反對 回復 2019-12-02
?
翻過高山走不出你

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。


查看完整回答
反對 回復 2019-12-02
?
牛魔王的故事

TA貢獻1830條經驗 獲得超3個贊

但是Alf和其他人明確指出long至少必須為32位。這就是我要建立的。C ++標準明確指出未指定字節中的位數??赡苁?、8、16、42 ...那么,如何將數字LONG_MIN-LONG_MAX調整為至少32位呢?


您需要在值表示形式中使用32位,以便至少獲得那么多的位模式。并且由于C ++需要整數的二進制表示(標準中明確的語言,第3.9.1 / 7節),因此QED


查看完整回答
反對 回復 2019-12-02
  • 3 回答
  • 0 關注
  • 644 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號