簡體   English   中英

如何將 ptrdiff_t 轉換為 int?

[英]How to convert ptrdiff_t to int?

            std::wstring x = L"test test test foo";
            std::wregex regexp("test");

            std::ptrdiff_t match_count(std::distance(
                std::wsregex_iterator(x.begin(), x.end(), regexp),
                std::wsregex_iterator()));

            int n = 3 * match_count;

match_count返回找到的正則表達式匹配的數量。

但是當我編譯這個例子時,我會收到如下警告:

warning C4244: 'initializing': conversion from 'ptrdiff_t' to 'int', possible loss of data 

我如何將ptrdiff_t轉換為int而不會“丟失數據”?

我如何將 ptrdiff_t 轉換為 int 而不會“丟失數據”?

通過為 int 大到足以表示 ptrdiff_t 的所有值的系統進行編譯。

如果您以 int 小於 ptrdiff_t 的系統為目標(如警告所示,您的目標系統就是該系統),則無法防止此類轉換可能導致數據丟失。

通過將較大的 integer 類型轉換為較小的類型,總是有可能丟失數據,因為較小的類型不可能代表較大的類型可以表示的所有值。

相反,您可以通過不執行此類轉換來避免數據丟失。

我如何將ptrdiff_t轉換為int而不會“丟失數據”?

在許多實現上(例如,Linux/x86-64 和 GCC 編譯的C++代碼)您無法避免數據丟失,因為int將具有 32 位,而ptrdiff_t將具有(如unsigned long )64位。

如果避免數據丟失至關重要(例如,對於安全關鍵嵌入式系統——如健康設備或飛機導航軟件中的軟件,具有通用標准要求......)我會添加運行時檢查。

或者,嘗試一些正式的方法方法,例如使用Frama-C 這意味着要證明數據不會丟失。

暫無
暫無

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

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