千家信息网

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

发表于:2025-01-28 作者:千家信息网编辑
千家信息网最后更新 2025年01月28日,本篇内容介绍了"C++为什么不要=通过使用无符号类型避免负值"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有
千家信息网最后更新 2025年01月28日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++ 代码 内容 实际 更多 知识 错误 检查 合法 实用 最大 学有所成 接下来 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 企业服务器组外网 浙江华为服务器虚拟化安装云空间 分析数据库的特征 网络安全的漏洞和防护 查询数据库分表 邮储银行软件开发加班吗 加强网络安全讲活 停止安全中心通知服务器 cjgl数据库 通州区网络安全产业园开园 电脑网络安全密码不匹配怎么办 南通有哪些网络技术公司 大话西游 服务器转出名额 扬州软件开发公司找哪家 司法厅开展网络安全宣传 网络安全设计与集成一级资质 爱思升级正在尝试恢复数据库 正定兜鞍网络技术 erp软件开发环境j2ee 漳州直播软件开发项目交流 关于软件开发的工作检讨 党对网络安全问题的 pg数据库添加只读权限账户 长春多媒体安全文化展厅软件开发 二零一八年网络安全宣传周活动 软件开发辅助设备摊销 中远集团服务的网络技术 网络技术大学有哪些 上海专业的进销存软件开发教程 阜阳餐饮软件开发定制
0