[英]Get the largest signed integer type in C++
假設我必須接受大小作為處理數組的接口的參數。 對於前
void doSomethingRelatedToArrays(const size_t length)
在這里,我使用size_t
時要牢記以下幾點:
size_t
始終被類型定義為系統中最大的無符號整數類型。 std::size_t
可以存儲任何類型的理論上可能存在的對象的最大大小。 但是,我不應該在接口中使用無符號類型,因為客戶端可以傳入一個負數,該負數會隱式轉換為無符號數,並且我在我的方法中沒有任何方法可以對其進行驗證。 請在此處參閱Scott Meyer關於此主題的文章。
因此,我應該將帶符號的整數類型傳遞給API。 但是,如何獲得系統中最大的有符號整數類型? 有沒有類似於size_t
的帶符號的typedef? 還是應該改用size_t
?
size_t
的帶符號等效項只是ssize_t
但是即使許多編譯器都知道,在C99標准中也未定義此類型。
對於C99標准,最大的有符號整數類型定義為intmax_t
。
參考:7.庫/ 7.18整數類型/ 7.18.1.5最大寬度整數類型
要使用的標准類型是std::intmax_t
,它在<cstdint>
定義。 要獲取最大值,可以使用std::numeric_limits<intmax_t>::max()
。
樣例代碼:
#include <cstdint>
#include <iostream>
#include <limits>
int main(int argc, char* argv[]) {
std::cout << "max size = " << std::numeric_limits<intmax_t>::max() << std::endl;
}
但是,如何獲得系統中最大的有符號整數類型?
在C ++ 11的<cstdint>
您可以找到intmax_t
類型,該類型是在C標准(7.20.1.5)之后定義的:
以下類型指定一個有符號整數類型,該類型能夠表示任何有符號整數類型的任何值
有沒有類似於size_t的帶符號的typedef?
不,不在C ++標准中。 POSIX定義了ssize_t
, 但是 :
size_t
(它本身也受到POSIX的限制)
ssize_t
應該能夠存儲至少在[-1,{SSIZE_MAX}]范圍內的值。
因此,我應該將帶符號的整數類型傳遞給API。 (...)還是應該只使用size_t?
如果您的接口打算處理C ++數組,則size_t
是標准所保證的唯一能夠容納任何可能的數組索引的類型。 使用任何其他類型,從理論上講,您可能會失去處理所有數組的能力(甚至在鏈接的文章中也有提到)。
因此,將size_t
用於索引目的是很常見的習慣,並且被許多庫(包括STL)使用。
最近的C和C ++標准中最大的有符號整數類型long long
。 直到有一種比long long
的類型,您才可以始終使用它。 如果您想成為將來的證明,請使用intmax_t
size_t
始終被類型定義為系統中最大的無符號整數類型
在32位系統中, size_t
通常也是32位類型,顯然不是最寬的類型。 僅保證它足夠大以表示系統上最大對象的大小。 在這種情況下, unsigned long long
更寬
如果需要size_t
則可以將ptrdiff_t
用作帶符號的副本。 但這也不是最大的類型。
對於短於
PTRDIFF_MAX
char
數組,std::ptrdiff_t
充當std::size_t
的有符號對應物:它可以存儲任何類型的數組的大小,並且在大多數平台上與std::intptr_t
同義
在C ++ 20中引入了std::ssize
並猜測是什么, 它還使用ptrdiff_t
作為size_t
的帶符號對等物
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.