您好,登錄后才能下訂單哦!
本篇內容介紹了“C++為什么不要=通過使用無符號類型避免負值”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
ES.106:不要試圖通過使用無符號類型避免負值
選擇無符號數意味著修改整數的很多無用行為(如含按模運算),這會抑制溢出關聯的警告信息,為有符號/無符號數混合計算相關的錯誤打開了大門。使用無符號數不會真的消除負值的可能性。
Example(示例)
unsigned int u1 = -2; // Valid: the value of u1 is 4294967294
int i1 = -2;
unsigned int u2 = i1; // Valid: the value of u2 is 4294967294
int i2 = u2; // Valid: the value of i2 is -2
在實際的代碼中,這些(完全合法的)構造中的隱含的問題很難發現,會帶來很多現實世界中的錯誤。考慮下面的代碼:
unsigned area(unsigned height, unsigned width) { return height*width; } // [see also](#Ri-expects)
// ...
int height;
cin >> height;
auto a = area(height, 2); // if the input is -2 a becomes 4294967292
記住當-1賦給一個無符號整數時,會變成一個最大的無符號整數。同時,由于無符號數學運算是按模運算,乘法運算不會溢出,而是發生回繞。
Example(示例)
unsigned max = 100000; // "accidental typo", I mean to say 10'000
unsigned short x = 100;
while (x < max) x += 100; // infinite loop
如果x是一個有符號短整數,我們會收到一個由于溢出而導致無定義行為的警告。
Alternatives(其他選項)
use signed integers and check for x >= 0
使用有符號整數并檢查x是否大于0
use a positive integer type
使用一個正整數類型
use an integer subrange type
使用值域限定的整數類型
Assert(-1 < x)
使用斷言檢查(-1<x)
For example(示例)
struct Positive {
int val;
Positive(int x) :val{x} { Assert(0 < x); }
operator int() { return val; }
};
int f(Positive arg) { return arg; }
int r1 = f(2);
int r2 = f(-2); // throws
“C++為什么不要=通過使用無符號類型避免負值”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。