簡體   English   中英

typedef 用於可以包含 size_t 的有符號類型?

[英]typedef for a signed type that can contain a size_t?

有符號類型的標准(或 MSVC 專有)typedef 可以包含全部size_t值嗎? 即在 64 位系統上,它將是一個 128 位有符號整數。

一般來說,定義這樣的類型是不可能的。 使size_t成為支持的最大無符號類型是完全合法的,這(幾乎可以肯定)意味着沒有有符號類型可以保存其所有值。

ptrdiff_t不一定足夠寬。 這是兩個指針相減的結果,但沒有什么說指針減法不會溢出。 請參閱 C++ 標准的第 5.7 節:

當兩個指向同一個數組對象的元素的指針相減時,結果就是兩個數組元素的下標之差。 結果的類型是實現定義的有符號整數類型; 此類型應與<cstddef>標頭 (18.2) 中定義為std::ptrdiff_t的類型相同。 與任何其他算術溢出一樣,如果結果不適合提供的空間,則行為未定義。

最大的有符號類型是intmax_t ,在<stdint.h><cstdint>中定義。 這是 C99 的一個特性,C++11 是第一個包含 C99 標准庫的 C++ 標准,所以你的編譯器可能不支持它(MSVC 很可能不支持)。 9 年后:這不再是什么大問題了。 )如果有符號類型的寬度足以容納size_t類型的所有可能值,那么intmax_t就是(盡管可能有更窄的有符號類型也符合條件)。

您還可以使用long long ,這是一種保證至少為 64 位的有符號類型(很可能與intmax_t相同)。 即使它的寬度不足以容納size_t類型的所有可能值,它也幾乎肯定會容納size_t類型的所有相關值——除非您的實現實際上支持大於 8 EB(即 8192 PB 或 8388608 TB)的對象。

(注意,我使用的是“exa-”、“peta-”和“tera-”的二進制定義,它們的有效性值得懷疑。)

如果您想要一個可以包含系統最大值的標准類型,也許<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 相同? 是的

現場演示

希望能幫助到你。

我假設您需要這種類型來進行某種指針運算。 除了std::ptrdiff_t之外,您不太可能需要其他任何東西。 這將在現代機器上發揮作用的唯一情況是當您處於 32 位模式並且您正在處理超過 2^31 字節的數據集時。 (如果沒有特殊工作,這甚至在 Windows 上都不可能。)您將無法同時使用兩個該大小的數組。 在這種情況下,您可能無論如何都應該在 64 位模式下工作。

在 64 位模式下,以目前的內存發展速度,在未來 40 年左右的時間里,它很可能不會成為問題。 當它出現問題時,在 128 位模式下編譯你的代碼,它會繼續運行。 ;)

如果您想要一個可以將std::size_t的每個值都保存為正值的有符號類型,我不知道有什么辦法。 假設你有相同的位數,存儲符號需要一位信息,所以新的最大值是舊的一半。 另一方面,使用該位的值的上半部分只是包裝到負數中,因此您始終可以回退。

真的,您可能需要將高無符號/負符號值與其他值分開,無論您將它們投射到何處。 如果 unsigned 0 <= x < M/2 <= y <= M映射到0 <= (x, y & (M/2)) < M/2 ,那么每個值都被考慮在內,但不會包裝為x 或 y 在任一方向。 如果有符號-M/2 <= y < 0 <= x < M/2映射到0 <= (x, y+M/2) < M則相同。

這樣您就知道x < 0y > M/2何時超出轉換范圍,但同時您可以進行比較,例如 unsigned y(M) < y(M)+1或 signed x(0) > x(0)-1包裝后通常會失敗,例如0 < -1 = MM > M+1 = 0等。

作為記錄,我認為最好計算std::size_t的相應簽名類型std::make_signed_t<std::size_t> 目前它很可能是來自unsigned long long long long但我不知道它有多普遍,或者它是否會改變。 我建議從那里使用std::numeric_limits<T>來檢查最小值/最大值。

暫無
暫無

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

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