本篇內容介紹了“C++為什么不要=通過使用無符號類型避免負值”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
鎮(zhèn)寧網站建設公司創(chuàng)新互聯(lián),鎮(zhèn)寧網站設計制作,有大型網站制作公司豐富經驗。已為鎮(zhèn)寧上千多家提供企業(yè)網站建設服務。企業(yè)網站搭建\成都外貿網站建設公司要多少錢,請找那個售后服務好的鎮(zhèn)寧做網站的公司定做!
ES.106:不要試圖通過使用無符號類型避免負值
選擇無符號數(shù)意味著修改整數(shù)的很多無用行為(如含按模運算),這會抑制溢出關聯(lián)的警告信息,為有符號/無符號數(shù)混合計算相關的錯誤打開了大門。使用無符號數(shù)不會真的消除負值的可能性。
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
在實際的代碼中,這些(完全合法的)構造中的隱含的問題很難發(fā)現(xiàn),會帶來很多現(xiàn)實世界中的錯誤??紤]下面的代碼:
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賦給一個無符號整數(shù)時,會變成一個最大的無符號整數(shù)。同時,由于無符號數(shù)學運算是按模運算,乘法運算不會溢出,而是發(fā)生回繞。
Example(示例)
unsigned max = 100000; // "accidental typo", I mean to say 10'000
unsigned short x = 100;
while (x < max) x += 100; // infinite loop
如果x是一個有符號短整數(shù),我們會收到一個由于溢出而導致無定義行為的警告。
Alternatives(其他選項)
use signed integers and check for x >= 0
使用有符號整數(shù)并檢查x是否大于0
use a positive integer type
使用一個正整數(shù)類型
use an integer subrange type
使用值域限定的整數(shù)類型
Assert(-1 < x)
使用斷言檢查(-1
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++為什么不要=通過使用無符號類型避免負值”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注創(chuàng)新互聯(lián)網站,小編將為大家輸出更多高質量的實用文章!