簡體   English   中英

使用lexical_cast到無符號類型時檢查負值

[英]Check for negative values when using lexical_cast to unsigned type

我有一種情況,我抓住命令行參數並使用boost::lexical_cast<unsigned long>(my_param) 我希望my_param的負值會導致lexical_cast拋出,但它會愉快地轉換它們,-1變為18446744073709551615 這似乎很荒謬,因為無符號長整數的最大值是2 ^ 32-1,它看起來更像是無符號長long。

所以我正在尋找一種更聰明的方法將char *輸入轉換為unsigned long,或者是一種驗證我沒有在偽裝中接受負值作為大型無符號long long的方法。

有一個錯誤報告反對你的問題提升,這解釋了為什么它的行為:

boost :: lexical_cast具有stringstream的行為,它使用std :: locale的num_get函數來轉換數字。 如果我們看一下編程語言的[22.2.2.1.2] - C ++(或[22.2.2.1.2]工作草案,編程語言C ++標准),我們會看到,num_get使用scanf的規則進行轉換。 在%u的C99標准中,輸入值減號是可選的,因此如果讀取負數,則不會出現錯誤,結果將是二進制補碼。

還有一個建議的包裝器解決方法:

https://svn.boost.org/trac/boost/ticket/5494

這正是按照標准處理負值的方式。 他們使用modulo 2 N算術。 這可以實現一個方便的技巧:使用-1作為某種類型的最大可能無符號值的簡寫。

如果您不喜歡此轉換,則必須在執行轉換之前掃描輸入以獲得減號。

暫無
暫無

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

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