C++为什么不要=通过使用无符号类型避免负值
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容介绍了"C++为什么不要=通过使用无符号类型避免负值"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有
千家信息网最后更新 2026年11月01日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安全错误
数据库的锁怎样保障安全
互联网科技股
科技金融是不是互联网金融
科技互联网政务服务
重庆互联网络科技
互联网 科技创业
天津摩尔互联网科技
奇士达互联网科技
互联网科技缩写
有木互联网科技
顺玮阁互联网科技
互联网 科技馆
顶级互联网科技成果有哪些
贵州叶脉互联网科技有限公司所属行业
互联网科技项目计划书材料类
浙江互联网科技研学营
企晟互联网信息科技有限公司
中科明德北京互联网科技
高科技互联网套路
锡山区互联网智能科技产品供应
互联网科技对化妆品行业
互联网的科技
齐家互联网科技
长亮科技互联网金融
浙江互联网科技研学营
荆州市昕露互联网络科技有限公司
赶超互联网科技 微信多开
翼展科技 首家互联网医院
怎样加入科技互联网
江苏苏星互联网科技有限公司
互联网时代高科技布局