![](/img/trans.png)
[英]Check if type can be an argument to boost::lexical_cast<string>
[英]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標准中,輸入值減號是可選的,因此如果讀取負數,則不會出現錯誤,結果將是二進制補碼。
還有一個建議的包裝器解決方法:
這正是按照標准處理負值的方式。 他們使用modulo 2 N算術。 這可以實現一個方便的技巧:使用-1作為某種類型的最大可能無符號值的簡寫。
如果您不喜歡此轉換,則必須在執行轉換之前掃描輸入以獲得減號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.