是否有一個標準類型(或MSVC專有)typedef,用於包含size_t
值的全部範圍的簽名類型?即在64位系統上,它將是一個128位有符號整數。typedef是否可以包含size_t的簽名類型?
回答
通常不可能定義這種類型。對於實現來說,使size_t
成爲最大的受支持的無符號類型是完全合法的,這意味着沒有簽名類型可以保存其所有值。
ptrdiff_t
不一定夠寬。這是減去兩個指針的結果,但沒有任何說明指針減法不能溢出。見第5.7節C++標準的:
當兩個指針相同的數組對象的元素相減, 的結果是兩個陣列 元素的下標之差。結果的類型是實現定義的有符號整數類型 ;此類型應與
std::ptrdiff_t
<cstddef>
表頭(18.2)中定義的類型相同。與其他 算術溢出一樣,如果結果不符合提供的空間,則 的行爲是未定義的。
最大的符號的類型是intmax_t
,在<stdint.h>
或<cstdint>
定義。這是一個C99特性,而C++ 11是第一個包含C99標準庫的C++標準,所以你的編譯器可能不支持它(而MSVC很可能不支持它)。如果有符號類型寬度足以容納size_t
類型的所有可能值,則intmax_t
是(儘管可能是是也是合格的較窄符號類型)。
您也可以使用long long
,這是一種保證至少爲64位的符號類型(最有可能與intmax_t
相同)。即使它不足以容納size_t
類型的所有可能值,它幾乎肯定會保留所有相關的值類型size_t
- 除非您的實現實際支持大於8 EB(8192 PB或8388608 TB)的對象。
(注意,我使用的「exa-」,「peta-」和「tera-」二進制的定義,這是有問題的有效性。)
*「和MSVC最有可能不會」* - 作爲一個方面說明,新的整數類型確實是* MSVC *標準庫自2010 *以來的少數C++ 11功能之一。 –
此外,如果您不確定在給定平臺上可以獲得多大的尺寸,請添加一個:static_assert(sizeof(intmax_t)> sizeof(size_t),「無法獲得保證尺寸爲size_t的簽名類型「);'所以編譯器會警告你,如果你有可能陷入困境。 –
我認爲你需要這種類型的一些一種指針算術。這是不太可能的,你需要任何東西比std::ptrdiff_t
。唯一的情況是,這將在現代機器上扮演一個角色,當你處於32位模式並且你正在處理一個數據集超過2^31字節時。 (在沒有特殊工作的情況下,這在Windows上是不可能的。)您將無法同時使用兩個這種大小的數組。在這種情況下,無論如何你都應該在64位模式下工作。
在64位模式下,隨着內存開發速度的提升,在接下來的40年左右時間內,它很可能不會成爲問題。當它成爲一個問題時,然後在128位模式下編譯你的代碼,它將繼續運行。 ;)
如果您想要一個可以包含系統最大值的標準類型,可能需要<cstdint>
(因爲C++ 11)可以提供幫助。
該頭文件中有一個typedef,它包含最大寬度整數類型,類型爲intmax_t
。有符號整數的intmax_t
和無符號整數的uintmax_t
是該體系結構完全支持的最大整數。
所以,讓我們假設你是在64位架構,下面的指令:
std::cout << "intmax_t is same int64_t? "
<< (std::is_same<intmax_t, int64_t>::value ? "Yes" : "No");
將輸出:
還會將intmax_t是相同的int64_t?是
希望它有幫助。
- 1. 包含typedef的類型專用模板
- 2. 是否可以在模板化函數簽名中使用typedef?
- 3. Node的ArrayList是否可以包含非節點類型?
- 4. 'anyURI'的xsd類型是否可以包含空格?
- 5. 是否可以從typedef中找到boost :: function的返回類型?
- 6. CakePHP模型名稱是否可以包含數字?
- 7. 果園 - 表單是否可以包含許多內容類型?
- 8. 是否可以更改匿名類型?
- 9. 是否可以獲取泛型類型的類型名稱?
- 10. OpenPGP簽名是否包含簽名者的用戶ID?
- 11. 泛型類的Typedef(別名)
- 12. 在DDD中,包含列表的類可以是值類型嗎?
- 13. typedef函數不是類型名稱嗎?
- 14. 標量類型是否包含類類型的指針?
- 15. 檢查列表是否包含類型?
- 16. 匿名類型是否可以繼承另一種類型?
- 17. 是否可以通過包含名稱的列來映射表?
- 18. 是否可以在我的列名中包含%符號?
- 19. 是否可以轉發聲明名稱空間內的typedef?
- 20. Perforce工作區視圖是否可以包含標籤?
- 21. 是否可以選擇包含模型中的字段?
- 22. C#中的ArrayList是否可以包含各種類型的對象?
- 23. 是否可以打包並簽名Microsoft Edge的擴展?
- 24. PARAM-VALUE是否可以包含空格?
- 25. 服務是否可以包含活動?
- 26. 可以檢查NSData是否包含NSString
- 27. UIViewController是否可以包含多個UIView?
- 28. ListView是否可以包含碎片
- 29. UINavigationController是否可以包含UITabbarController?
- 30. Shift-JIS是否可以包含零?
'unsigned long long' –
哎呀錯字標題。我問的是簽名類型。 – japreiss
如果你想要一個簽名類型的原因是爲了重載/以特殊含義轉義它,你可以考慮'boost :: optional <>'包裝器。 –