簡體   English   中英

獲取C ++中最大的有符號整數類型

[英]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同義

http://en.cppreference.com/w/cpp/types/ptrdiff_t

在C ++ 20中引入了std::ssize並猜測是什么, 它還使用ptrdiff_t作為size_t的帶符號對等物

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM