C++为什么不要=通过使用无符号类型避免负值

本篇内容介绍了“C++为什么不要=通过使用无符号类型避免负值”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

镇宁网站建设公司创新互联,镇宁网站设计制作,有大型网站制作公司丰富经验。已为镇宁上千多家提供企业网站建设服务。企业网站搭建\成都外贸网站建设公司要多少钱,请找那个售后服务好的镇宁做网站的公司定做!

ES.106:不要试图通过使用无符号类型避免负值

Reason(原因)

选择无符号数意味着修改整数的很多无用行为(如含按模运算),这会抑制溢出关联的警告信息,为有符号/无符号数混合计算相关的错误打开了大门。使用无符号数不会真的消除负值的可能性。

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

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++为什么不要=通过使用无符号类型避免负值”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


分享题目:C++为什么不要=通过使用无符号类型避免负值
标题链接:http://bzwzjz.com/article/isgigs.html

其他资讯

Copyright © 2007-2020 广东宝晨空调科技有限公司 All Rights Reserved 粤ICP备2022107769号
友情链接: 成都网站设计 高端品牌网站建设 高端定制网站设计 企业网站设计 重庆手机网站建设 成都网站制作 企业网站制作 成都响应式网站建设 网站制作 成都网站建设 重庆企业网站建设 成都网站制作 网站建设改版 响应式网站设计方案 成都网站设计 成都网站设计 网站设计 四川成都网站制作 营销网站建设 成都网站建设流程 成都定制网站建设 成都商城网站建设